标签:ems cti tween turn number signed cpp air tree
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, 3...N-1.
We will ask you to perfrom some instructions of the following form:
The first line of input contains an integer t, the number of test cases (t <= 20). t test cases follow.
For each test case:
There is one blank line between successive tests.
For each "QUERY" operation, write one integer representing its result.
Input: 1 3 1 2 1 2 3 2 QUERY 1 2 CHANGE 1 3 QUERY 1 2 DONE Output: 1 3
#include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<queue> #include<bitset> #include<ctime> #include<deque> #include<stack> #include<functional> #include<sstream> //#include<cctype> //#pragma GCC optimize(2) using namespace std; #define maxn 100005 #define inf 0x7fffffff //#define INF 1e18 #define rdint(x) scanf("%d",&x) #define rdllt(x) scanf("%lld",&x) #define rdult(x) scanf("%lu",&x) #define rdlf(x) scanf("%lf",&x) #define rdstr(x) scanf("%s",x) #define mclr(x,a) memset((x),a,sizeof(x)) typedef long long ll; typedef unsigned long long ull; typedef unsigned int U; #define ms(x) memset((x),0,sizeof(x)) const long long int mod = 1e9; #define Mod 1000000000 #define sq(x) (x)*(x) #define eps 1e-5 typedef pair<int, int> pii; #define pi acos(-1.0) //const int N = 1005; #define REP(i,n) for(int i=0;i<(n);i++) typedef pair<int, int> pii; inline int rd() { int x = 0; char c = getchar(); bool f = false; while (!isdigit(c)) { if (c == ‘-‘) f = true; c = getchar(); } while (isdigit(c)) { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); } return f ? -x : x; } ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b); } int sqr(int x) { return x * x; } /*ll ans; ll exgcd(ll a, ll b, ll &x, ll &y) { if (!b) { x = 1; y = 0; return a; } ans = exgcd(b, a%b, x, y); ll t = x; x = y; y = t - a / b * y; return ans; } */ struct node { int to, nxt; }e[maxn]; int head[maxn], tot; int top[maxn];// top[v]表示v所在的重链的顶点 int fa[maxn]; int dep[maxn]; int num[maxn];// num[v]表示以v为根的子树大小 int p[maxn];// p[v]表示v与其父亲节点在线段树的位置 int fp[maxn]; int son[maxn];// 重儿子 int pos; int n; void init() { tot = 0; memset(head, -1, sizeof(head)); pos = 1; memset(son, -1, sizeof(son)); } void addedge(int u, int v) { e[tot].to = v; e[tot].nxt = head[u]; head[u] = tot++; } void dfs1(int u, int pre, int d) { dep[u] = d; fa[u] = pre; num[u] = 1; for (int i = head[u]; i != -1; i = e[i].nxt) { int v = e[i].to; if (v != pre) { dfs1(v, u, d + 1); num[u] += num[v]; if (son[u] == -1 || num[v] > num[son[u]])son[u] = v; } } } void dfs2(int u, int sp) { top[u] = sp; if (son[u] != -1) { p[u] = pos++; fp[p[u]] = u; dfs2(son[u], sp); } else { p[u] = pos++; fp[p[u]] = u; return; } for (int i = head[u]; i != -1; i = e[i].nxt) { int v = e[i].to; if (v != son[u] && v != fa[u])dfs2(v, v); } } #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int maxx[maxn]; int val[maxn]; void pushup(int rt) { maxx[rt] = max(maxx[rt << 1], maxx[rt << 1 | 1]); } void build(int l, int r, int rt) { if (l == r) { maxx[rt] = val[l]; return; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt); } void upd(int p, int x, int l, int r, int rt) { if (l == r) { maxx[rt] = x; return; } int m = (l + r) >> 1; if (p <= m)upd(p, x, lson); else upd(p, x, rson); pushup(rt); } int query(int L, int R, int l, int r, int rt) { if (L <= l && r <= R) { return maxx[rt]; } int m = (l + r) >> 1; int ans = 0; if (L <= m)ans = max(ans, query(L, R, lson)); if (m < R)ans = max(ans, query(L, R, rson)); return ans; } int Find(int u, int v) { int f1 = top[u], f2 = top[v]; int tmp = 0; while (f1 != f2) { if (dep[f1] < dep[f2]) { swap(f1, f2); swap(u, v); } tmp = max(tmp, query(p[f1], p[u], 1, n, 1)); u = fa[f1]; f1 = top[u]; } if (u == v)return tmp; if (dep[u] > dep[v])swap(u, v); return max(tmp, query(p[son[u]], p[v], 1, n, 1)); } int ed[maxn][3]; int main() { // ios::sync_with_stdio(0); int t; t = rd(); while (t--) { init(); n = rd(); // getchar(); for (int i = 0; i < n - 1; i++) { ed[i][0] = rd(); ed[i][1] = rd(); ed[i][2] = rd(); addedge(ed[i][0], ed[i][1]); addedge(ed[i][1], ed[i][0]); } dfs1(1, 0, 0); dfs2(1, 1); for (int i = 0; i < n - 1; i++) { if (dep[ed[i][0]] < dep[ed[i][1]]) { swap(ed[i][0], ed[i][1]); } val[p[ed[i][0]]] = ed[i][2]; } build(1, n, 1); char opt[10]; while (scanf("%s",opt)) { if (opt[0] == ‘D‘)break; int u, v; u = rd(); v = rd(); if (opt[0] == ‘Q‘) { printf("%d\n", Find(u, v)); } else upd(p[ed[u - 1][0]], v, 1, n, 1); } } return 0; }
标签:ems cti tween turn number signed cpp air tree
原文地址:https://www.cnblogs.com/zxyqzy/p/10354449.html