讨论 / 帮我看看,最后六个点超时
jiangzh 2013-03-02 17:49:00
点我顶贴 收藏 删除
我在电脑上用大数据都没问题,怎么会超时呢。。。。。

代码

/*http://blog.csdn.net/jiangzh7

By Jiangzh*/

#include<cstdio>

const int N=100000+10;

#define data_up() if(val[p]==-1&&val[p<<1]==val[(p<<1)+1])val[p]=val[p<<1]

int n,q;

struct link{int y;link *next;}*head[N];

int L[N],R[N],tt=0;

bool hash[N];

int val[N*4];

int sum[N*4];

void inlink(int x,int y)

{

link *node=new link;

node->y=y;

node->next=head[x];

head[x]=node;

}

void read()

{

scanf("%d",&n);

for(int i=1;i<n;i++)

{

int u,v;

scanf("%d%d",&u,&v);

inlink(u,v);

inlink(v,u);

}

}

void dfs(int x)

{

if(hash[x]) return; hash[x]=true;

tt++;L[x]=tt;

for(link *node=head[x];node;node=node->next) dfs(node->y);

R[x]=tt;

}

void data_down(int p)

{

if(val[p]!=-1)

{

val[p<<1]=val[(p<<1)+1]=val[p];

val[p]=-1;

}

}

void change(int p,int l,int r,int a,int b)

{

if(a<=l && b>=r)

{

if(val[p]!=-1)

{

if(val[p]==0)

{

val[p]=1;

sum[p]=r-l+1;

}

else if(val[p]==1)

{

val[p]=0;

sum[p]=0;

}

return;

}

}

int m=(l+r)>>1;

if(val[p]==1) {sum[p<<1]=m-l+1;sum[(p<<1)+1]=r-(m+1)+1;}

if(val[p]==0) {sum[p]=sum[p<<1]=sum[(p<<1)+1]=0;}

data_down(p);

if(a<=m) change(p<<1,l,m,a,b);

if(b>m) change((p<<1)+1,m+1,r,a,b);

data_up();

sum[p]=sum[p<<1]+sum[(p<<1)+1];

}

int query(int p,int l,int r,int a,int b)

{

if(a<=l&&b>=r)

{

//if(val[p]==1) return r-l+1;

//if(val[p]==0) return 0;

return sum[p];

}

int m=(l+r)>>1,x1=0,x2=0;

if(val[p]==1) {sum[p<<1]=m-l+1;sum[(p<<1)+1]=r-(m+1)+1;}

if(val[p]==0) {sum[p]=sum[p<<1]=sum[(p<<1)+1]=0;}

data_down(p);

if(a<=m) x1=query(p<<1,l,m,a,b);

if(b>m) x2=query((p<<1)+1,m+1,r,a,b);

data_up();

sum[p]=sum[p<<1]+sum[(p<<1)+1];

return x1+x2;

}

void work()

{

dfs(1);

//for(int i=1;i<=n;i++) printf("%d ",L[i]);puts("");

//for(int i=1;i<=n;i++) printf("%d ",R[i]);puts("");puts("");puts("");

scanf("%d",&q);

for(int i=1;i<=q;i++)

{

char op;int x;

scanf("\n%c%d",&op,&x);

if(op=='C') change(1,1,tt,L[x],R[x]);

else printf("%d\n",query(1,1,tt,L[x],R[x]));

//for(int i=1;i<=10;i++) printf("%d ",val[i]);puts("");

//for(int i=1;i<=10;i++) printf("%d ",sum[i]);puts("");puts("");

}

}

int main()

{

//freopen("chinese.in","r",stdin);

//freopen("chinese.out","w",stdout);

read();

work();

return 0;

}

状态: Unaccepted

测评机: Xeond[6]

得分: 40分

提交日期: 2013-3-3 9:19:00

有效耗时: 766毫秒

测试结果1: 通过本测试点|有效耗时109ms

测试结果2: 通过本测试点|有效耗时141ms

测试结果3: 通过本测试点|有效耗时406ms

测试结果4: 通过本测试点|有效耗时110ms

测试结果5: 选手程序运行超过时限

测试结果6: 选手程序运行超过时限

测试结果7: 选手程序运行超过时限

测试结果8: 选手程序运行超过时限

测试结果9: 选手程序运行超过时限

测试结果10: 选手程序运行超过时限

查看更多回复
提交回复