POJ2182 Lost Cows 树状数组
2015-04-03 13:27
218 查看
一群牛,编号为1到n,但是编号乱了,已知每只牛的前面有多少只编号比其小,求出牛的编号。
插点问段。
这道题要从后面反推回来,比如最后的一只牛,知道有a只编号比它小,则它的编号为a+1。
update 更新已经确定的编号,
sum(i) 查询已经确定的编号中(后面的牛的编号都确定了),有多少个比i小。
poj2182
插点问段。
这道题要从后面反推回来,比如最后的一只牛,知道有a只编号比它小,则它的编号为a+1。
update 更新已经确定的编号,
sum(i) 查询已经确定的编号中(后面的牛的编号都确定了),有多少个比i小。
#include<cstdio> #include<algorithm> #include<cstring> const int MAXN=8000+5; int c[MAXN]; int a[MAXN]; int ans[MAXN]; int tot; int lowbit(int x) { return x&(-x); } void update(int x,int num,int n) { while(x<=n){ c[x]+=num; x+=lowbit(x); } } int sum(int x) { int temp=0; while(x>0){ temp+=c[x]; x-=lowbit(x); } return temp; } int main() { int n; while(scanf("%d",&n)!=EOF){ memset(c,0,sizeof(c)); memset(ans,0,sizeof(ans)); tot=n; a[0]=a[1]=0; for(int i=2;i<=n;i++) scanf("%d",&a[i]); for(int i=n;i>0;i--){ for(int j=a[i]+1;j<=n;j++){ if(1+sum(j)+a[i]==j){ ans[tot]=j; break; } } update(ans[tot],1,n); tot--; } for(int i=1;i<=n;i++){ printf("%d\n",ans[i]); } } return 0; }
poj2182
相关文章推荐
- [POJ2182]Lost Cows(树状数组,二分)
- POJ 2182 Lost Cows (树状数组,递推)
- POJ 题目2182 Lost Cows(树状数组+二分)
- Lost Cows(树状数组+二分)
- poj-2182-Lost Cows (树状数组,线段树)
- POJ 2182 Lost Cows(树状数组)
- 线段树和树状数组各过一次POJ2182
- POJ 2182 Lost Cows (树状数组)
- poj 2182 Lost Cows(树状数组)
- POJ 2182 Lost Cows(树状数组,暴力解法)
- POJ 2182 Lost Cows (树状数组 or 线段树)
- poj 2182 Lost Cows(树状数组)
- POJ 2182 Lost Cows(树状数组)
- POJ-2182 Lost Cows (二分 + 树状数组 或者平衡树)
- POJ 2182 Lost Cows(树状数组+二分)
- 【树状数组--思维】poj 2182 Lost Cows
- POJ 2182 Lost Cows (树状数组+二分 / 线段树 / 枚举)
- poj 2182 Lost Cows 树状数组
- 暑假-树状数组-B - Lost Cows
- 【二维树状数组】poj 2155 Matrix