full wa 求调
查看原帖
full wa 求调
390770
S0CRiA楼主2022/1/16 22:19
//P4315
#include <bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
using namespace std;

const int N = 1e5 + 10;
int dep[N], siz[N], fat[N][20], son[N], nid[N], wet[N], top[N], cnt;
int Head[N], Edge[N*2], Leng[N*2], Next[N*2], rk[N], tot;
struct node{ int mx, add, cov, l, r, iscov; } T[N*4];
int n, lg; char op[10];
int a[N], b[N], c[N];

void addedge(int u, int v, int w){
	Edge[++tot] = v, Leng[tot] = w, Next[tot] = Head[u], Head[u] = tot;
	Edge[++tot] = u, Leng[tot] = w, Next[tot] = Head[v], Head[v] = tot;
}
void dfs1(int x, int fa){
	dep[x] = dep[fa] + 1, siz[x] = 1, fat[x][0] = fa;
	for(int i = 1; i <= lg; ++ i) fat[x][i] = fat[fat[x][i-1]][i-1];
	for(int i = Head[x], mss = -1; i; i = Next[i]){
		int y = Edge[i]; if(y == fa) continue;
		dfs1(y, x); siz[x] += siz[y], rk[y] = Leng[i];
		if(siz[y] > mss) son[x] = y, mss = siz[y];
	}
}
void dfs2(int x, int tp){
	nid[x] = ++ cnt, wet[cnt] = rk[x], top[x] = tp;
	if(!son[x]) return; dfs2(son[x], tp);
	for(int i = Head[x]; i; i = Next[i]){
		int y = Edge[i]; if(y == fat[x][0] || y == son[x]) continue;
		dfs2(y, y);
	}
}
void pushup(int p){ T[p].mx = max(T[ls].mx, T[rs].mx); }
void pushdown(int p){
	if(T[p].iscov)
		T[ls].add = T[rs].add = 0, T[p].cov = 0, T[p].iscov = 0, 
		T[ls].mx = T[rs].mx = T[ls].cov = T[rs].cov = T[p].cov;
	T[ls].mx += T[p].add, T[rs].mx += T[p].add,
	T[ls].add += T[p].add, T[rs].add += T[p].add, T[p].add = 0;
} 
void build(int p, int l, int r){
	T[p].l = l, T[p].r = r, T[p].iscov = 0, T[p].add = 0;
	if(l == r){ T[p].mx = wet[l]; return; }
	int mid = l + r >> 1;
	build(ls, l, mid); build(rs, mid+1, r); pushup(p);
}
void cover(int p, int l, int r, int v){
	if(l <= T[p].l && T[p].r <= r){ T[p].mx = T[p].cov = v, T[p].add = 0, T[p].iscov = 1; return; }
	int mid = T[p].l + T[p].r >> 1; pushdown(p);
	if(l <= mid) cover(ls, l, r, v); if(mid < r) cover(rs, l, r, v);
	pushup(p);
}
void change(int p, int l, int r, int v){
	if(l <= T[p].l && T[p].r <= r){ T[p].mx += v, T[p].add += v; return; }
	int mid = T[p].l + T[p].r >> 1; pushdown(p);
	if(l <= mid) change(ls, l, r, v); if(mid < r) change(rs, l, r, v);
	pushup(p);
}
int query(int p, int l, int r){
	if(l <= T[p].l && T[p].r <= r) return T[p].mx;
	int mid = T[p].l + T[p].r >> 1, res = 0; pushdown(p);
	if(l <= mid) res = max(res, query(ls, l, r)); 
	if(mid < r) res = max(res, query(rs, l, r));
	return res;
}
void cover_(int x, int y, int v){
	while(top[x] != top[y]){
		if(dep[top[x]] < dep[top[y]]) swap(x, y);
		cover(1, nid[top[x]], nid[x], v), x = fat[top[x]][0];
	}
	if(dep[x] > dep[y]) swap(x, y);
	cover(1, nid[x]+1, nid[y], v);
}
void change_(int x, int y, int v){
	while(top[x] != top[y]){
		if(dep[top[x]] < dep[top[y]]) swap(x, y);
		change(1, nid[top[x]], nid[x], v), x = fat[top[x]][0];
	}
	if(dep[x] > dep[y]) swap(x, y);
	change(1, nid[x]+1, nid[y], v);
}
int query_(int x, int y){
	int res = 0;
	while(top[x] != top[y]){
		if(dep[top[x]] < dep[top[y]]) swap(x, y);
		res = max(res, query(1, nid[top[x]], nid[x])), x = fat[top[x]][0];
	}
	if(dep[x] > dep[y]) swap(x, y);
	return max(res, query(1, nid[x]+1, nid[y]));
}

int main(){
	scanf("%d", &n); lg = log(n) / log(2) + 1;
	for(int i = 1, u, v, w; i < n; ++ i) scanf("%d%d%d", &u, &v, &w), addedge(u, v, w), a[i]=u,b[i]=v,c[i]=w;
	dfs1(1, 0);	dfs2(1, 1); build(1, 1, n);
	while(true){
		int u, v, w; scanf("%s", op);
		if(op[2] == 'a'){
			scanf("%d%d", &u, &v);
			int x = a[u], y = b[u];
			if(dep[x] > dep[y]) swap(x, y);
			cover_(x, y, v);
		} else if(op[2] == 'v'){
			scanf("%d%d%d", &u, &v, &w);
			cover_(u, v, w);
		} else if(op[2] == 'd'){
			scanf("%d%d%d", &u, &v, &w);
			change_(u, v, w);
		} else if(op[2] == 'x'){
			scanf("%d%d", &u, &v); 
			printf("%d\n", query_(u, v));
		} else return 0;
	}
}
2022/1/16 22:19
加载中...