Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
就是先删完之后再往上倒吧,我也是这样,可是还是TLE,能帮忙看一下的话,感激不尽!代码如下!In Reply To:如果是该节点是右儿子则直接找父亲,左儿子则察看右儿子数量够不够,不够就找父亲 Posted by:gaminerie at 2006-08-07 20:01:17 #include <stdio.h> #include <string.h> #define MAXN 500100 struct People { char name[12]; int shift; }arr[MAXN]; int ant[]={1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560,10080, 15120,20160,25200,27720,45360,50400,55440,83160,110880,166320,221760,277200,332640,498960,500100}; int ans[]={1,2,3,4,6,8,9,10,12,16,18,20,24,30,32,36,40,48,60,64,72,80,84,90,96,100,108,120,128,144, 160,168,180,192,200,0}; int mat[MAXN*3]; int tree[MAXN*3]; void init(int left,int right,int v) { tree[v]=right-left+1; if(left!=right) { init(left,(left+right)/2,2*v); init((left+right)/2+1,right,2*v+1); } else mat[v]=left; } int main() { int n,k,f,t,left,right,v,count,i; while(scanf("%d%d",&n,&k)!=EOF) { for(i=1;i<=n;i++) scanf("%s%d",arr[i].name,&arr[i].shift); memset(mat,0,sizeof(mat)); init(1,n,1); for(t=0;t<36;t++) if(n<ant[t]) break; t--; for(i=1;i<ant[t];i++) { left=1,right=n,v=1; while(left!=right) { tree[v]--; if(k>(left+right)/2) { left=(left+right)/2+1; v=v*2+1; } else { right=(left+right)/2; v=v*2; } } //if(i==3) printf("%d--\n",v); tree[v]--; if(arr[k].shift>0) { f=v/2; count=arr[k].shift; //if(i==3) printf("%d--\n",count); while(f) { if(v==f*2&&tree[f*2+1]>=count) { v=f*2+1; break; } if(v==f*2) count-=tree[f*2+1]; v=f; f=v/2; } //if(i==3) printf("%d--%d--%d\n",v,f,count); if(!f) count%=tree[1]; if(!count) count=tree[1]; //printf("%d--%d\n",tree[1],count); while(!mat[v]) { //printf("%d--\n",v); if(tree[v*2]>=count) v=v*2; else { count-=tree[v*2]; v=v*2+1; } } //printf("%d-------------\n",v); k=mat[v]; //printf("%d----\n",k); } else { f=v/2; count=-arr[k].shift; while(1) { if(v==f*2+1&&tree[f*2]>=count) { v=f*2; break; } if(v==f*2+1) count-=tree[f*2]; v=f; f=v/2; } if(!f) count%=tree[1]; if(!count) count=tree[1]; while(!mat[v]) { if(tree[v*2+1]>=count) v=v*2+1; else { count-=tree[v*2+1]; v=v*2; } } k=mat[v]; } } printf("%s %d\n",arr[k].name,ans[t]); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator