题意 公司中有n个员工 除了boss 每个员工都有自己的上司 自己下属的下属也是自己的下属 当给一个员工分配任务时 这个员工会把任务也分配到自己的所有下属 每个员工都只做最后一个被分配的任务 对于每个C x 输出员工x正在做的任务 没有就输出-1
把员工的关系数建成类似并查集的结构 把每个直接分配任务的员工的任务和任务分配时间保存起来 查询时只要找这个员工所有父节点中最晚分配的任务
#include <bits/stdc++.h>
using namespace std;
const int N = 50005;
struct employee{
int task, t;
} e[N];
int par[N];
int main()
{
int cas, a, b, n, m;
char op[5];
scanf("%d", &cas);
for(int k = 1; k <= cas; ++k)
{
printf("Case #%d:\n", k);
memset(par, -1, sizeof(par));
scanf("%d", &n);
for(int i = 1; i < n; ++i)
{
e[i].t = e[i].task = 0;
scanf("%d%d", &a, &b), par[a] = b;
}
e[n].t = e[n].task = 0;
scanf("%d", &m);
int t = 0, last, ans;
while(m--)
{
scanf("%s%d", op, &a);
if(op[0] == 'C')
{
last = 0;//所有祖先节点最晚任务的时间
while(a != -1)
{
if(e[a].t > last)
last = e[a].t, ans = e[a].task;
a = par[a];
}
printf("%d\n", last ? ans : -1);
}
else
{
scanf("%d", &b);
e[a].task = b, e[a].t = ++t;
}
}
}
return 0;
}
//Last modified : 2015-04-22 20:48
1 5 4 3 3 2 1 3 5 2 5 C 3 T 2 1 C 3 T 3 2 C 3
Case #1: -1 1 2
HDU 3974 Assign the task(树 并查集)
原文地址:http://blog.csdn.net/acvay/article/details/45201291