[kuangbin带你飞]专题七 线段树 J HDU 3974

来源:互联网 发布:网络写手排名 编辑:程序博客网 时间:2024/05/20 05:27

题目地址:https://vjudge.net/contest/66989#problem/J

思路:讲真,我没看出来这是线段树啊……我用类似并查集的方法,记录每一个人的上级,然后对于每个人,更新操作时记录时间以及这件事是第几件。查找时,从目标人物向上查找,如果有比他当前记录的事顺序更后面的事,说明他的事情以及变了,更新答案继续向上找,直到找到最高级的的那个boss

AC代码:

#include<bits/stdc++.h>using namespace std;const int maxn=5e4+10;int fa[maxn];struct person{    int task,count;}E[maxn];int main(){    int t;    scanf("%d",&t);    for(int casei=1;casei<=t;casei++)    {        int n;        scanf("%d",&n);        for(int i=0;i<=n;i++)            fa[i]=-1;        for(int i=1;i<n;i++)        {            int a,b;            scanf("%d%d",&a,&b);            fa[a]=b;        }        int m;        scanf("%d",&m);        for(int i=0;i<=n;i++)        E[i].task=E[i].count=-1;        int sum=0;        printf("Case #%d:\n",casei);        while(m--)        {        char a[2];        scanf("%s",a);        if(a[0]=='C')        {            int a;            scanf("%d",&a);            int task=E[a].task;            int count=E[a].count;            while(a!=-1)            {                if(E[a].count>=count)                {                    task=E[a].task;                    count=E[a].count;                }                a=fa[a];            }            printf("%d\n",task);        }        else if(a[0]=='T')        {            int a,b;        scanf("%d%d",&a,&b);        E[a].task=b;        E[a].count=++sum;        }        }    }}


0 0
原创粉丝点击