~~~~
数据太水,暴力无压力,不过还是用线段树写了下,表现了楼主对线段树的无限热爱之情。
~~~~
题目连接:http://poj.org/problem?id=2182
大致题意;牛牛因XXXXXX原因乱序成一排,现已知每头牛前面有多少头牛比它的编号小(第一头牛前面没有当然就不列粗来了),求每头牛的编号。
思路:从后往前扫描,遇到a,则说明它是剩余序列的第a+1头牛。
~~~~
暴力代码:(157ms)
#include<cstdio> #include<algorithm> #include<cstring> #define N 8888 using namespace std; int q[N],a[N],ans[N]; int main() { int n; while(scanf("%d",&n)==1) { q[0]=0;a[0]=1; for(int i=1;i<n;i++) { scanf("%d",&q[i]); a[i]=i+1; } for(int i=n-1;i>=0;i--) { ans[i]=a[q[i]]; for(int j=q[i];j<n-1;j++) a[j]=a[j+1]; } for(int i=0;i<n;i++) printf("%d\n",ans[i]); } return 0; }
~~~~
线段树代码:(32ms)
#include<cstdio> #include<algorithm> #include<cstring> #define N 8888 #define lson rt<<1,s,m #define rson rt<<1|1,m+1,e using namespace std; int tre[N<<2]; void build(int rt,int s,int e) { tre[rt]=e-s+1; //用tre数组存每条线段间有多少个牛 if(s==e) return ; int m=(s+e)>>1; build(lson); build(rson); } int query(int val,int rt,int s,int e) { tre[rt]--; //每次query,牛数必减1,因为下一次询问总是从剩余的序列中。 if(s==e) return s; //~~ int m=(s+e)>>1; if(val<=tre[rt<<1]) return query(val,lson); else return query(val-tre[rt<<1],rson); } int q[N],ans[N]; int main() { int n; while(scanf("%d",&n)==1) { build(1,1,n); q[0]=0; //~~ for(int i=1;i<n;i++) scanf("%d",&q[i]); for(int i=n-1;i>=0;i--) ans[i]=query(q[i]+1,1,1,n); for(int i=0;i<n;i++) printf("%d\n",ans[i]); } return 0; }
POJ 2182 Lost Cows.(线段树),布布扣,bubuko.com
时间: 2024-10-25 14:17:01