多校第12場FZU Assign the task(暴力DFS)
これを叩いて問題になったとき、突然自分が配列シミュレーションの臨界表さえできないことに気づいた.罪、罪..
#include <cstdio>
#include <cstring>
int n,m;
const int maxn=200050;
int head[maxn],cnt;
struct Edge{
int v,task,next;
}edge[maxn];
int node[maxn];
void addedge (int v,int u)
{
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void dfs (int u,int task)
{
int p=head[u];
node[u]=task;
for ( ; ~p ; p=edge[p].next)
{
int v=edge[p].v;
dfs(v,task);
}
return;
}
void init ()
{
memset (head , -1 , sizeof(head));
cnt=0;
}
void debug ()
{
for (int i=0 ; i<n ; ++i)
{
printf("%d ",node[i]);
}
printf("
");
}
int main ()
{
int cas;
char tmp[5];
int u,v,task;
scanf("%d",&cas);
for (int I=1 ; I<=cas ; ++I)
{
scanf("%d",&n);
init();
memset (node , -1 ,sizeof(node));
for (int i=0 ; i<n-1 ; ++i)
{
scanf("%d%d",&u,&v);
addedge(u,v);
}
scanf("%d",&m);
printf("Case #%d:
",I);
for (int i=0 ; i<m ; ++i)
{
scanf("%s",tmp);
if(tmp[0]=='C')
{
scanf("%d",&u);
printf("%d
",node[u]);
//debug();
}
if(tmp[0]=='T')
{
scanf("%d%d",&u,&task);
dfs(u,task);
}
}
}
return 0;
}