Wannafly 模拟赛A Laptop 树状数组
2018-04-04 21:09
666 查看
题解:
树状数组+二维偏序。要同时满足i.a>j.a,i.b>j.b才算完虐,然后这道题不想求逆序数那样可以求出多对逆序,这道题只能求出多少个被完虐。所以我们排完第一个序列之后就给编号,然后排序第二个序列,再离散化,然后就进入像计算逆序数那样计算了,但是这里有点不同,因为是要同时满足i.a>j.a,i.b>j.b才算完虐,所以我们从后面开始算,并且如果满足放进去的个数-getsum(e[i])>0就算完虐。
树状数组+二维偏序。要同时满足i.a>j.a,i.b>j.b才算完虐,然后这道题不想求逆序数那样可以求出多对逆序,这道题只能求出多少个被完虐。所以我们排完第一个序列之后就给编号,然后排序第二个序列,再离散化,然后就进入像计算逆序数那样计算了,但是这里有点不同,因为是要同时满足i.a>j.a,i.b>j.b才算完虐,所以我们从后面开始算,并且如果满足放进去的个数-getsum(e[i])>0就算完虐。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MAXN=1e5+7; struct node { int val,val2,pos; }a[MAXN]; int c[MAXN]; int e[MAXN]; int n; bool cmp1(node b,node d) { return b.val<d.val; } bool cmp2(node b,node d) { return b.val2<d.val2; } int lowbit(int x) { return x&(-x); } void add(int x) { for(int i=x;i<=n;i+=lowbit(i)) c[i]++; } int getsum(int x) { int sum=0; for(int i=x;i>=1;i-=lowbit(i)) sum+=c[i]; return sum; } int main() { while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) scanf("%d%d",&a[i].val,&a[i].val2); memset(c,0,sizeof(c)); sort(a+1,a+n+1,cmp1); for(int i=1;i<=n;i++) a[i].pos=i; sort(a+1,a+n+1,cmp2); for(int i=1;i<=n;i++) e[a[i].pos]=i,printf("%d %d\n",a[i].pos,a[i].val2); memset(c,0,sizeof(c)); long long int sum=0; int x=1; for(int i=n;i>=1;i--) { add(e[i]); if(x-getsum(e[i])) sum++; x++; } printf("%lld\n",sum); } }
相关文章推荐
- Wannafly模拟赛4 A 题 Laptop 【二维偏序问题 + 树状数组维护】
- Wannafly模拟赛4 A Laptop (RMQ)
- Wannafly模拟赛4 A Laptop (前缀数组)
- Wannafly模拟赛4:A -Laptop(后缀)
- Wannafly模拟赛4-C-sum(二进制拆分+树状数组)
- Wannafly模拟赛4 B.Distance 最大曼哈顿距离
- Wannafly模拟赛 树【思维+Dp】
- Wannafly模拟赛3 绝对半径2051(离散化+尺取法)
- Wannafly模拟赛4 B.Distance 最大曼哈顿距离
- Wannafly模拟赛 A.矩阵(二分答案+hash)
- Wannafly模拟赛4 B.Distance 最大曼哈顿距离
- Wannafly模拟赛2 C alliances(dfs序+二分)
- Wannafly模拟赛3 绝对半径2051(尺取)
- wannafly 4 laptop
- Wannafly模拟赛4 B.Distance 最大曼哈顿距离
- Wannafly模拟赛4 B题 Distance 【最大曼哈顿距离】
- Wannafly模拟赛3
- Wannafly模拟赛3 E 绝对半径2051【尺取】(可做模板)
- Wannafly模拟赛3 贝伦卡斯泰露(搜索+剪枝)
- Wannafly模拟赛4 B Distance(枚举 最大曼哈顿距离模板)