链接:http://acm.hdu.edu.cn/showproblem.php?pid=3974
这道题目的意思是这样的:
给你一个N,说明有N个人
然后接下来N行是这些人的关系
两个数字表示后者是前者的boss
然后再给你一个M,说明下面有M种情形
遇到C,你就要输出当前C后面跟着的那个号数的经理当前在做的任务。
遇到T,例如:T 2 1,你就要把任务1给2经理,而且,他的下属都要马上更换成这个任务。
所以出现C的时候,有可能问的很后面的经理当前的任务。
处理的方法是延后标记
记下最后一次改变任务的父亲经理的任务
AC代码如下(有参考大神的,忘记是哪位了,如果有看到神似的话,请不要喷,这里道歉下):
#include <stdio.h>
#include <iostream>
using namespace std;
const int MAX = 50010;
struct NODE
{
int task,count;
};
NODE p[MAX];
int parent[MAX];
void init()
{
memset(parent,-1,sizeof(parent));
}
int main()
{
int ncases,n,u,v,m,x,task;
char s[5];
scanf("%d",&ncases);
int ind=1;
while(ncases--)
{
scanf("%d",&n);
init();
int i;
for(i=0;i<n-1;i++)
{
scanf("%d%d",&u,&v);
parent[u]=v;
}
for(i=1;i<=n;i++)
{
p[i].task=-1;
p[i].count=-1;
}
scanf("%d",&m);
printf("Case #%d:\n",ind++);
int count=0;
while(m--)
{
scanf("%s",s);
if(s[0]=='T')
{
scanf("%d%d",&x,&task);
p[x].task=task;
p[x].count=++count;
}
else
{
scanf("%d",&x);
task=p[x].task;
int count=p[x].count;
while(x!=-1)
{
if(p[x].count>count)
{
task=p[x].task;
count=p[x].count;
}
x=parent[x];
}
printf("%d\n",task);
}
}
}
return 0;
}