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;
    }
    
  • 相关阅读:
    【LeetCode】155. Min Stack 最小栈
    【Java】修改Eclipse默认编码
    负数取模
    【算法第四版笔记】1.1 基础编程模型
    【计算方法】02
    【计算方法】01
    【Java】Java8中List排序
    选择排序算法
    排序算法
    【Java】Eclipse修改JSP文件默认编码
  • 原文地址:https://www.cnblogs.com/Kv-Stalin/p/11233700.html
Copyright © 2011-2022 走看看