POJ 2481 Cows(树状数组)
2017-05-07 21:49
399 查看
http://poj.org/problem?id=2481
题意:
有n头牛,每头牛有一个区间[S,E],求每头牛比它区间大的牛的个数。
思路:
先对数据进行一下排序,先按右坐标按降序排列,那么接下来我们只需要比较左坐标的数值大小就可以了。
题意:
有n头牛,每头牛有一个区间[S,E],求每头牛比它区间大的牛的个数。
思路:
先对数据进行一下排序,先按右坐标按降序排列,那么接下来我们只需要比较左坐标的数值大小就可以了。
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<cmath> #include<map> #include<stack> using namespace std; const int maxn=1e5+5; int n; int c[maxn]; int ans[maxn]; int MAX; struct node { int l,r,id; }a[maxn]; bool cmp(node a,node b) { return a.r>b.r||(a.r==b.r&&a.l<b.l); } int lowbit(int x) { return x&-x; } int sum(int x) { int ret=0; while(x>0) { ret+=c[x]; x-=lowbit(x); } return ret; } void add(int x,int d) { while(x<=MAX+1) { c[x]+=d; x+=lowbit(x); } } int main() { //freopen("D:\\input.txt","r",stdin); while(scanf("%d",&n)) { if(n==0) break; memset(c,0,sizeof(c)); memset(ans,0,sizeof(ans)); MAX=0; for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].l,&a[i].r); a[i].l++; a[i].r++; a[i].id=i; MAX=max(MAX,a[i].r); } sort(a+1,a+1+n,cmp); ans[a[1].id]=0; add(a[1].l,1); for(int i=2;i<=n;i++) { if(a[i].l==a[i-1].l && a[i].r==a[i-1].r) ans[a[i].id]=ans[a[i-1].id]; else { ans[a[i].id]=sum(a[i].l); } add(a[i].l,1); } for(int i=1;i<=n;i++) { if(i!=1) printf(" "); 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 (树状数组 +1 p2352 妙用加深~)
- POJ 2481 Cows && POJ 2352 Stars(树状数组妙用)
- POJ 2481 Cows 【树状数组】
- POJ 2481 Cows(树状数组)
- poj 2481 Cows(树状数组 | 线段树)
- poj 2481 cows(树状数组)
- POJ 2481 Cows【树状数组】
- poj 2481 Cows 【树状数组】
- poj 2481 Cows(树状数组)题目有陷阱,转换后与stars类似
- POJ 题目2481 Cows(树状数组)
- POJ 2481 Cows【树状数组】
- poj 2481 Cows(树状数组)
- POJ 2481——Cows(树状数组)
- POJ 2481 Cows (树状数组)
- POJ 2481 Cows(树状数组)