zoukankan      html  css  js  c++  java
  • HDU 3974 Assign the task [并查集扩展]

    http://acm.hdu.edu.cn/showproblem.php?pid=3974
    题意:一公司有n个人,编号1~n,每个人都有一个直属上司。
    两种操作:
    1,给x分配任务y,此时,x会将y也分配给他的下属,下属再分配给下属……也就是x下面的人都会放下原先的任务(如果有)而去忙任务y
    2,问x当前的任务,若没有则输出-1

    思路:给每个任务按时间编号,询问的时候,只需要找到x以及他的所有上司手上时间最靠后的任务就好了。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    
    #define rep(i,f,t) for(int i = (f),_end = (t); i <= _end; ++i)
    const int maxn = 50005;
    int task[maxn];
    int p[maxn];
    int t[maxn];
    
    int solve(int i){
        int j = i;
        int k = t[i];
        while(p[j] != j){
            k = max(k, t[p[j]]);
            j = p[j];
        }
        return task[k];
    }
    int main(){
        int can,n,m,u,v;
        task[0] = -1;
        scanf("%d",&can);
        rep(cas,1,can){
            printf("Case #%d:
    ",cas);
            int tn = 0;
            rep(i,1,n){
                p[i] = i;
                t[i] = 0;
            }
            scanf("%d",&n);
            rep(i,1,n-1){
                scanf("%d%d",&u,&v);
                p[u] = v;
            }
            scanf("%d",&m);
            while(m--){
                char c;
                int a,b;
                scanf(" %c",&c);
                if(c == 'C'){
                    scanf("%d",&a);
                    int ans = solve(a);
                    printf("%d
    ",ans);
                } else {
                    scanf("%d%d",&a,&b);
                    task[++tn] = b;
                    t[a] = tn;
                }
            }
        }
        return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    如何使用Log4j
    HDU 1114
    老鼠与毒药问题
    HDU 1065
    HDU 1301(MST)
    HDU 1078
    HDU 2159
    删除字符问题(贪心)
    正整数分解为几个连续自然数之和
    OpenJudge
  • 原文地址:https://www.cnblogs.com/DSChan/p/4861979.html
Copyright © 2011-2022 走看看