标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10695 | Accepted: 6865 |
Description
Input
Output
Sample Input
5 1 2 1 0
Sample Output
2 4 5 3 1
题意:
第一行给出cow的数目n,接下来2-n行给出每个排在第2-n各位置的cow的在其编号比其小的个数。最后按排队顺序依次给出每个cow的编号。
思路:
从后向前确定编号,设比最后一个cow小的cow数目为a,则最后一个cow的编号为所剩下cow 的第(a+1)大编号。
#include"cstdio" #include"cstring" #include"algorithm" using namespace std; const int MAXN=8005; int n; int deg[MAXN]; int vis[MAXN]; int ans[MAXN]; int seek(int k) { int pos=0; for(int i=1;i<=n;i++) { if(!vis[i]) { pos++; if(pos==k) return i; } } } int main() { while(scanf("%d",&n)!=EOF) { memset(vis,0,sizeof(vis)); deg[0]=0; for(int i=1;i<n;i++) { scanf("%d",°[i]); } for(int i=n-1;i>=0;i--) { int pos=seek(deg[i]+1); vis[pos]=1; ans[i]=pos; } for(int i=0;i<n;i++) { printf("%d\n",ans[i]); } } return 0; }
转化为排队问题,利用线段树求解.
#include"cstdio" #include"cstring" #include"algorithm" using namespace std; const int MAXN=8005; struct node{ int l,r; int n; }a[MAXN*4]; int que[MAXN]; int pos[MAXN]; void build(int rt,int l,int r) { a[rt].l=l; a[rt].r=r; a[rt].n=(r-l+1); if(l==r) return; int mid=(l+r)>>1; build(rt<<1,l,mid); build((rt<<1)|1,mid+1,r); } void update(int rt,int pos,int i) { if(a[rt].l==a[rt].r) { a[rt].n--; que[i]=a[rt].l; return ; } if(pos<=a[rt<<1].n) update(rt<<1,pos,i); else update((rt<<1)|1,pos-a[rt<<1].n,i); a[rt].n=a[rt<<1].n+a[(rt<<1)|1].n; } int main() { int n; while(scanf("%d",&n)!=EOF) { build(1,1,n); pos[0]=0; for(int i=1;i<n;i++) { scanf("%d",&pos[i]); } for(int i=n-1;i>=0;i--) { update(1,pos[i]+1,i); } for(int i=0;i<n;i++) { printf("%d\n",que[i]); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5133211.html