POJ:2481 Cows
2013-11-11 11:13
435 查看
这题个人感觉不错,乍一看是个区间覆盖问题,其实是用树状数组求逆序数。
但是有些地方要注意。所谓stronger是指一个区间可以完全覆盖另一个区间,如果这俩区间完全相同是不算的。
按x左边升序排序,如果x相同y要降序排序。
在用树状数组的时候要注意了,假设区间为p[],我们这里是求p.y的逆序数,其实也要考虑p.x。
假设当前区间的下标为i(i从1开始),那么p[i]前一个元素的下标为i-1。
如果p[i]!=p[i-1],那么说明p[i-1].x是比p[i].x小的,这样的话p[i-1]是否比p[i]strong只取决于y,在i之前出现的只要比p[i].y大或者相等的都是比p[i]strong的。
如果p[i]==p[i-1],那么说明这俩区间完全相同,那么比p[i]strong的数目就是和p[i-1]的相同了。
题目中有说明不存在左右区间相当的情况,所以不会有0 0这种超时数据。
但是有些地方要注意。所谓stronger是指一个区间可以完全覆盖另一个区间,如果这俩区间完全相同是不算的。
按x左边升序排序,如果x相同y要降序排序。
在用树状数组的时候要注意了,假设区间为p[],我们这里是求p.y的逆序数,其实也要考虑p.x。
假设当前区间的下标为i(i从1开始),那么p[i]前一个元素的下标为i-1。
如果p[i]!=p[i-1],那么说明p[i-1].x是比p[i].x小的,这样的话p[i-1]是否比p[i]strong只取决于y,在i之前出现的只要比p[i].y大或者相等的都是比p[i]strong的。
如果p[i]==p[i-1],那么说明这俩区间完全相同,那么比p[i]strong的数目就是和p[i-1]的相同了。
题目中有说明不存在左右区间相当的情况,所以不会有0 0这种超时数据。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; struct Point { int x,y,num; Point():x(0),y(0),num(0) {} }; bool cmp(Point a,Point b) { if(a.x==b.x) return a.y>b.y; return a.x<b.x; } int a[100005],ans[100005],n,N; Point p[100005]; int lowbit(int x) { return (-x)&x; } int Sum(int pos) { int sum=0; while(pos>0) { sum+=a[pos]; pos-=lowbit(pos); } return sum; } void Add(int pos,int val) { while(pos<=N) { a[pos]+=val; pos+=lowbit(pos); } } int main() { while(scanf("%d",&n)&&n) { memset(a,0,sizeof(a)); memset(ans,0,sizeof(ans)); N=0; for(int i=1; i<=n; ++i) { scanf("%d%d",&p[i].x,&p[i].y); p[i].num=i; N=max(N,p[i].y); } sort(p+1,p+n+1,cmp); for(int i=1; i<=n; ++i) { if(p[i].x==p[i-1].x&&p[i].y==p[i-1].y) { ans[p[i].num]=ans[p[i-1].num]; Add(p[i].y,1); } else { ans[p[i].num]=i-1-Sum(p[i].y-1); Add(p[i].y,1); } } for(int i=1; i<=n; ++i) if(i==1) printf("%d",ans[i]); else printf(" %d",ans[i]); printf("\n"); } return 0; }
相关文章推荐
- POJ 2481 cows
- POJ 2481 Cows【树状数组 变相求逆序对】
- POJ - 2481 Cows解题报告(树状数组 相同点重复计数处理)
- poj 2481 Cows
- poj_2481,Cows,树状数组
- poj 2481 Cows 线段树
- POJ 2481 Cows 简单树状数组区间覆盖
- POJ 2481 Cows 树状数组
- POJ 2481 Cows 【树状数组】
- poj 2481 Cows(树状数组)
- POJ - 2481 Cows(树状数组)
- POJ-2481 Cows 树状数组
- POJ 2481 Cows
- POJ(2481)Cows 树状数组
- POJ 2481 Cows【树状数组】
- poj 2481 Cows
- POJ 2481 Cows【树状数组】
- POJ 2481 Cows(树状数组)
- POJ 2481 Cows
- poj 2481 Cows(数状数组 或 线段树)