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

来源:互联网 发布:百胜软件股份有限公司 编辑:程序博客网 时间:2024/06/05 19:05

传送门
//这个是经典的二维偏序问题, 偏序问题也是比较难的一部分, 当上了三维以后, 就要不断用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;    }}
原创粉丝点击