水题求助
  • 板块P4114 Qtree1
  • 楼主CultReborn
  • 当前回复10
  • 已保存回复10
  • 发布时间2023/11/15 11:24
  • 上次更新2023/11/15 15:20:32
查看原帖
水题求助
672866
CultReborn楼主2023/11/15 11:24

WA 0pts

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 100005;
inline LL Read();void Rite(LL x);
int a[maxn],c[maxn],n;
int head[maxn],cnt(-1);
int fth[maxn],dep[maxn],dfn[maxn];
int siz[maxn],son[maxn],top[maxn];
int ti = 0;
struct node{
	int u,to,nxt,cst;
}edge[maxn * 2];
struct SegmentTree{
	int left,right;
	LL data;
#define l(p) t[p].left
#define r(p) t[p].right
#define d(p) t[p].data
}t[maxn * 4];
void Input(int u,int v,int w){
	edge[++cnt] = {u,v,head[u],w};
	head[u] = cnt;
}
void DFS1(int u,int fa){
	dep[u] = dep[fa] + 1;
	siz[u] = 1;
	fth[u] = fa;
	for(int i = head[u];~i;i = edge[i].nxt){
		int v = edge[i].to;
		if(v == fa) continue;
		c[v] = edge[i].cst;
		DFS1(v,u);
		siz[u] += siz[v];
		if(!son[u] || siz[son[u]] < siz[v])
			son[u] = v;
	}
}
void DFS2(int u,int tp){
	dfn[u] = ++ti;
	a[ti] = c[u];
	top[u] = tp;
	if(!son[u]) return;
	DFS2(son[u],tp);
	for(int i = head[u];~i;i = edge[i].nxt){
		int v = edge[i].to;
		if(son[u] != v && fth[u] != v)
			DFS2(v,v);
	}
}
void Build(int p,int l,int r){
	l(p) = l; r(p) = r;
	if(l == r){d(p) = a[l];return;}
	int mid = (l + r) / 2;
	Build(p * 2,l,mid);
	Build(p*2+1,mid + 1,r);
	d(p) = max(d(p * 2),d(p*2+1));
}
void Change(int p,int l,LL d){
	if(l(p) == r(p)){d(p) = max(d,d(p));return;}
	int mid = (l(p) + r(p)) / 2;
	if(l <= mid) Change(p * 2,l,d);
	else Change(p*2+1,l,d);
	d(p) = max(d(p * 2),d(p*2+1));
}
LL Ask(int p,int l,int r){
	if(l <= l(p) && r >= r(p))
		return d(p);
	LL ans(INT_MIN);
	int mid = (l(p) + r(p)) / 2;
	if(l <= mid) ans = max(ans,Ask(p * 2,l,r));
	if(r > mid)  ans = max(ans,Ask(p*2+1,l,r));
	return ans;
}
LL Query(int u,int v){
	if(u == v) return 0;
	LL ans(0);
	while(top[u] != top[v]){
		if(dep[top[u]] < dep[top[v]]) swap(u,v);
		ans = max(ans,Ask(1,dfn[top[u]],dfn[u]));
		u = fth[top[u]];
	}
	if(dep[u] > dep[v]) swap(u,v);
	ans = max(ans,Ask(1,dfn[u] + 1,dfn[v]));
	return ans;
}
int main(){
	n = Read();
	memset(head,-1,sizeof(head));
	for(int i = 1;i <= n - 1;++i){
		int u(Read()),v(Read()),w(Read());
		Input(u,v,w); Input(v,u,w);
	}
	DFS1(1,0); DFS2(1,1); Build(1,1,n);
	while(1){
		string s; cin >> s;
		if(s[0] == 'D') break;
		int x(Read()),y(Read());
		if(s[0] == 'C'){
			x = (x - 1) * 2;
			int u(edge[x].u),v(edge[x].to);
			if(fth[v] == u) swap(u,v);
			Change(1,dfn[u],y);
		}
		else Rite(Query(x,y)),putchar('\n');
	}
	return 0;
}
inline LL Read(){
	char c = getchar();
	LL x = 0,f = 1;
	while(c < '0' || c > '9'){
		if(c == '-') f = -1;
		c = getchar();
	}
	while(c >= '0' && c <= '9'){
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}void Rite(LL x){
	if(x < 0) putchar('-'),x = -x;
	if(x > 9) Rite(x / 10);
	putchar(x % 10 + '0');
}
2023/11/15 11:24
加载中...