| ||||||||||
| 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 | |||||||||
或许你是想得太复杂了吧In Reply To:就是先删完之后再往上倒吧,我也是这样,可是还是TLE,能帮忙看一下的话,感激不尽!代码如下! Posted by:nuanran at 2006-08-07 20:04:18 > #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