| ||||||||||
| 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