zoukankan      html  css  js  c++  java
  • [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;
    }
    
  • 相关阅读:
    xx
    office 2016 下载链接
    Revit 2019 下载链接
    AE cc 2019 下载链接
    Premiere Pro cc 2019 下载链接
    Photoshop cc 2019 下载链接
    百度云单机版、软件包及教程
    Visual Studio 2017 软件包及教程
    归并排序:逆序对问题
    归并排序:小和问题
  • 原文地址:https://www.cnblogs.com/Kv-Stalin/p/11233700.html
Copyright © 2011-2022 走看看