[USACO17JAN]Balanced Photo平衡的照片 (树状数组)

题目链接

Solution

先离散化,然后开一个大小为 \(100000\) 的树状数组记录前面出现过的数。
然后查询 \((h[i],n]\) 即可.
还要前后各做一遍。

Code

#include<bits/stdc++.h>
#define N 200008
#define ll long long
using namespace std;

void in(ll &x)
{
    char ch=getchar();ll f=1,w=0;
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){w=w*10+ch-'0';ch=getchar();}
    x=f*w; return;
}

ll h[N],c[N],a[N],n;
ll L[N],R[N],ans;

ll lowbit(ll x){return x&(-x);}
void insert(int x)
{for(int i=x;i<=n;i+=lowbit(i))c[i]++;}
ll query(int x)
{ll ans=0;for(int i=x;i>=1;i-=lowbit(i))ans+=c[i];return ans;}

int main()
{
    //freopen("a.in","r",stdin);
    in(n);
    for(int i=1;i<=n;i++)in(h[i]),a[i]=h[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    h[i]=lower_bound(a+1,a+n+1,h[i])-a;
    for(int i=1;i<=n;i++)
        L[i]=query(n)-query(h[i]),insert(h[i]);
    memset(c,0,sizeof(c));
    for(int i=n;i>=1;i--)
        R[i]=query(n)-query(h[i]),insert(h[i]);
    for(int i=1;i<=n;i++)
    {
        ll x=L[i],y=R[i];
        if(x<y)swap(x,y);
        if(x==y)continue;
        if(x>y*2)ans++;
    }cout<<ans<<endl;
}

猜你喜欢

转载自www.cnblogs.com/Kv-Stalin/p/11233700.html