Wannafly模拟赛4 A 题 Laptop 【二维偏序问题 + 树状数组维护】

传送门
//这个是经典的二维偏序问题, 偏序问题也是比较难的一部分, 当上了三维以后, 就要不断用cdq分治以及一些高级数据结构来解决. 但是这道题还是比较简单的, 只是一个普通的二维偏序, 所以直接对第一维进行排序, 然后用树状数组维护第二维, 然后对于每一个插入, 我们寻找它的后缀和, (前缀和不好实现) 然后不断更新答案即可. (因为数很大, 所以需要进行离散化)

AC Code

const int maxn = 1e5+5;
int n;
int c[maxn];
void add(int x) { for(;x<=n;x+=x&(-x)) c[x]++; }
int getsum(int x) { int res=0; for(;x;x-=x&(-x)) res+=c[x]; return res; }
pair<int,int>pii[maxn];
vector<int>ve;
void solve()
{
    while(~scanf("%d",&n)){
        ve.clear();
        for(int i=1;i<=n;i++){
            scanf("%d%d",&pii[i].fi,&pii[i].se);
            ve.push_back(pii[i].se);
        }
        sort(ve.begin(),ve.end());
        sort(pii+1,pii+1+n);
        int res = 0;
        for(int i=n;i>=1;i--){
            int pos = lower_bound(ve.begin(),ve.end(),pii[i].se) - ve.begin() + 1;
            if(getsum(n) - getsum(pos)) res++;
            add(pos);
        }
        cout << res << endl;
    }
}

你可能感兴趣的:(树状数组)