数据过水
查看原帖
数据过水
383395
WaterSun楼主2023/3/27 19:13

rt。将 sz[i] += sz[j] 打成了 sz[i] += j 还对了。

code:

#include <bits/stdc++.h>
#define re register

using namespace std;

const int N = 1e5 + 10,M = 2e5 + 10;
int n,idx,num;
int h[N],ne[M],e[M],w[M],pre[M],nxt[M];
int f[N],d[N],sz[N],wson[N],arr[N],id[N],tp[N],val[N];

struct node{
	int l;
	int r;
	int Max;
	int add;
	int upd;
}tr[N << 2];

inline int read(){
	int r = 0,w = 1;
	char c = getchar();
	while (c < '0' || c > '9'){
		if (c == '-') w = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9'){
		r = (r << 3) + (r << 1) + (c ^ 48);
		c = getchar();
	}
	return r * w;
}

inline void add(int a,int b,int c){
	ne[idx] = h[a];
	pre[idx] = a;
	nxt[idx] = e[idx] = b;
	w[idx] = c;
	h[a] = idx++;
}

inline void pushup(int u){
	tr[u].Max = max(tr[u << 1].Max,tr[u << 1 | 1].Max);
}

inline void pushdown(int u){
	if (~tr[u].upd){
		tr[u << 1].Max = tr[u].upd;
		tr[u << 1].upd = tr[u].upd;
		tr[u << 1].add = 0;
		tr[u << 1 | 1].Max = tr[u].upd;
		tr[u << 1 | 1].upd = tr[u].upd;
		tr[u << 1 | 1].add = 0;
		tr[u].upd = -1;
	}
	if (tr[u].add){
		tr[u << 1].Max += tr[u].add;
		tr[u << 1].add += tr[u].add;
		tr[u << 1 | 1].Max += tr[u].add;
		tr[u << 1 | 1].add += tr[u].add;
		tr[u].add = 0;
	}
}

inline void build(int u,int l,int r){
	tr[u] = {l,r,0,0,-1};
	if (l == r){
		tr[u].Max = val[l];
		return;
	}
	int mid = l + r >> 1;
	build(u << 1,l,mid);
	build(u << 1 | 1,mid + 1,r);
	pushup(u);
}

inline void modify_add(int u,int l,int r,int k){
	if (l <= tr[u].l && tr[u].r <= r){
		tr[u].Max += k;
		tr[u].add += k;
		return;
	}
	pushdown(u);
	int mid = tr[u].l + tr[u].r >> 1;
	if (l <= mid) modify_add(u << 1,l,r,k);
	if (r > mid) modify_add(u << 1 | 1,l,r,k);
	pushup(u);
}

inline void modify_upd(int u,int l,int r,int k){
	if (l <= tr[u].l && tr[u].r <= r){
		tr[u].Max = k;
		tr[u].add = 0;
		tr[u].upd = k;
		return;
	}
	pushdown(u);
	int mid = tr[u].l + tr[u].r >> 1;
	if (l <= mid) modify_upd(u << 1,l,r,k);
	if (r > mid) modify_upd(u << 1 | 1,l,r,k);
	pushup(u);
}

inline int query(int u,int l,int r){
	if (l <= tr[u].l && tr[u].r <= r) return tr[u].Max;
	pushdown(u);
	int res = 0;
	int mid = tr[u].l + tr[u].r >> 1;
	if (l <= mid) res = max(res,query(u << 1,l,r));
	if (r > mid) res = max(res,query(u << 1 | 1,l,r));
	return res;
}

inline void dfs1(int u,int fa){
	sz[u] = 1;
	f[u] = fa;
	d[u] = d[fa] + 1;
	for (re int i = h[u];~i;i = ne[i]){
		int j = e[i];
		if (j == fa) continue;
		dfs1(j,u);
		if (sz[j] > sz[wson[u]]) wson[u] = j;
		sz[u] += j;
		arr[j] = w[i];
	}
}

inline void dfs2(int u,int fa,int top){
	num++;
	id[u] = num;
	tp[u] = top;
	val[num] = arr[u];
	if (!wson[u]) return;
	dfs2(wson[u],u,top);
	for (re int i = h[u];~i;i = ne[i]){
		int j = e[i];
		if (j == fa || j == wson[u]) continue;
		dfs2(j,u,j);
	}
}

inline void modify_link_upd(int x,int y,int k){
	while (tp[x] != tp[y]){
		if (d[tp[x]] < d[tp[y]]) swap(x,y);
		modify_upd(1,id[tp[x]],id[x],k);
		x = f[tp[x]];
	}
	if (d[x] > d[y]) swap(x,y);
	modify_upd(1,id[x] + 1,id[y],k);
}

inline void modify_link_add(int x,int y,int k){
	while (tp[x] != tp[y]){
		if (d[tp[x]] < d[tp[y]]) swap(x,y);
		modify_add(1,id[tp[x]],id[x],k);
		x = f[tp[x]];
	}
	if (d[x] > d[y]) swap(x,y);
	modify_add(1,id[x] + 1,id[y],k);
}

inline int query_link(int x,int y){
	int res = 0;
	while (tp[x] != tp[y]){
		if (d[tp[x]] < d[tp[y]]) swap(x,y);
		res = max(res,query(1,id[tp[x]],id[x]));
		x = f[tp[x]];
	}
	if (d[x] > d[y]) swap(x,y);
	res = max(res,query(1,id[x] + 1,id[y]));
	return res;
}

int main(){
//	freopen("P4315_1.in","r",stdin);
//	freopen("out.out","w",stdout);
	memset(h,-1,sizeof(h));
	n = read();
	for (re int i = 1;i < n;i++){
		int a,b,c;
		a = read();
		b = read();
		c = read();
		add(a,b,c);
		add(b,a,c);
	}
	dfs1(1,-1);
	dfs2(1,-1,1);
	build(1,1,n);
	while (1){
		char op[10];
		scanf("%s",op);
		if (op[0] == 'S') break;
		if (op[1] == 'h'){
			int x,y;
			x = (read() << 1) - 1;
			y = read();
			int u = pre[x];
			int v = nxt[x];
			modify_link_upd(u,v,y);
		}
		else if (op[1] == 'o'){
			int x,y,z;
			x = read();
			y = read();
			z = read();
			modify_link_upd(x,y,z);
		}
		else if (op[0] == 'A'){
			int x,y,z;
			x = read();
			y = read();
			z = read();
			modify_link_add(x,y,z);
		}
		else{
			int x,y;
			x = read();
			y = read();
			printf("%d\n",query_link(x,y));
		}
	}
//	cout << endl << endl;
//	for (re int i = 1;i <= 10;i++) cout << tr[i].Max << " ";
	return 0;
}
2023/3/27 19:13
加载中...