标签:art amp print other contain star rip beginning str
1 5 4 3 3 2 1 3 5 2 5 C 3 T 2 1 C 3 T 3 2 C 3Sample Output
Case #1: -1 1 2
题意 : 每个老板有很多员工 , 当老板有任务时 , 他的所有员工都会执行此任务 , 并且弃掉他以前的任务。
思路 :
这题是在线段树专题里的 , 然后我自己构造了一个树 , 用 vector 存的点 , 但是超内存了 , 我也不知道什么鬼 , 搜网上的也有用 vector 写的 , 但他们没事 , 搞不懂 。
还有一种解法 , 是用并查集解的 , 他与普通的区别在于 他对每个节点在多加一个参数 ,表示当前变量出现的时间截点 。
代码示例 :
/* * Author: ry * Created Time: 2017/10/13 20:59:29 * File Name: 1.cpp */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <string> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #include <time.h> using namespace std; const int eps = 5e4+5; const double pi = acos(-1.0); const int inf = 0x3f3f3f3f; #define Max(a,b) a>b?a:b #define Min(a,b) a>b?b:a #define ll long long struct s { int task; int time; }po[eps]; int pre[eps]; int main() { int t, n, m; int a, b; char ch[5]; int k = 1; cin >>t; while (t--){ cin >>n; for(int i = 1; i <= n; i++){ po[i].task = -1; po[i].time = 0; } for(int i = 1; i <= n; i++) pre[i] = i; for(int i = 1; i < n; i++){ scanf("%d%d", &a, &b); pre[a] = b; } printf("Case #%d:\n", k++); cin >>m; int t = 0; while (m--){ scanf("%s", ch); if (ch[0] == ‘C‘){ scanf("%d", &a); int ans = -1, time = 0; int i = a; while (pre[i] != i){ if (po[i].time > time) { ans = po[i].task; time = po[i].time; } i = pre[i]; } if (po[i].time > time) ans = po[i].task; printf("%d\n", ans); } else { scanf("%d%d", &a, &b); t++; po[a].task = b; po[a].time = t; } } } return 0; }
标签:art amp print other contain star rip beginning str
原文地址:http://www.cnblogs.com/ccut-ry/p/7663407.html