树剖,洛谷的镜像过了,但是这里提交却RE是什么原因
查看原帖
树剖,洛谷的镜像过了,但是这里提交却RE是什么原因
366338
fjy666楼主2021/12/28 15:42

RT,

// created time : 2021-12-28 12:12:41
// writer : fjy
#include <bits/stdc++.h>
#define _rep(i_,a_,b_) for(int i_ = a_;i_ <= b_;++i_)
int in(void) { int x; scanf("%d",&x); return x; }
typedef long long ll;
using namespace std;
const int kN = 100005;
vector<pair<int,int> > g[kN];
int mx[kN << 2],n,fa[kN],top[kN],dfn[kN],siz[kN],son[kN],dep[kN],v[kN],dfs_clock;
void assign(int p,int d,int x = 1,int L = 1,int R = n) {
	if(L == R) mx[x] = d;
	else {
		if(p <= (L+R) / 2) assign(p,d,x<<1,L,(L+R) / 2);
		else assign(p,d,x<<1|1,(L+R) / 2 + 1,R);
		mx[x] = max(mx[x<<1],mx[x<<1|1]);
	}
}
int query(int l,int r,int x = 1,int L = 1,int R = n) {
	if(l > r || l < 1 || r > n) return 0;
	if(l <= L && R <= r) return mx[x]; int ans = 0;
	if(l <= (L+R) / 2) ans = max(ans,query(l,r,x<<1,L,(L+R) / 2)); 
	if((L + R) / 2 < r) ans = max(ans,query(l,r,x<<1|1,(L+R) / 2 + 1,R));
	return ans;
} 
void dfs1(int u,int f) {
	fa[u] = f,dep[u] = dep[f] + 1,siz[u] = 1; int mx = 0;
	for(pair<int,int> &edge : g[u]) if(edge.first != f) {
		v[edge.first] = edge.second; dfs1(edge.first,u);
		siz[u] += siz[edge.first]; if(siz[edge.first] > mx) mx = siz[edge.first],son[u] = edge.first;
	}
}
void dfs2(int u,int t) {
	top[u] = t,dfn[u] = ++dfs_clock; assign(dfs_clock,v[u]); if(!son[u]) return; dfs2(son[u],t);
	for(pair<int,int> &edge : g[u]) if(edge.first != son[u] && edge.first != fa[u]) dfs2(edge.first,edge.first);
}
int QUERY(int a,int b) {
	int ans = 0;
	while(top[a] != top[b]) {
		if(dep[top[a]] < dep[top[b]]) swap(a,b);
		ans = max(ans,query(dfn[top[a]],dfn[a]));
		a = fa[top[a]];
	}
	if(dfn[a] > dfn[b]) swap(a,b); ans = max(ans,query(dfn[a] + 1,dfn[b]));
	return ans;
}
pair<int,int> edges[kN];
int MODIFY(int i,int t) {
	int a = edges[i].first,b = edges[i].second;
	dep[a] > dep[b] ? assign(dfn[a],t) : assign(dfn[b],t);
}
int main() {
	int t = in();
	while(t--) {
		n = in(); 
		_rep(i,0,kN - 1) g[i].clear();
		memset(mx,0,sizeof(mx));
		memset(son,0,sizeof(son));
		memset(dep,0,sizeof(dep));
		memset(dfn,0,sizeof(dfn));
		memset(fa,0,sizeof(fa));
		memset(siz,0,sizeof(siz));
		memset(top,0,sizeof(top));
		memset(v,0,sizeof(v));
		dfs_clock = 0;
		_rep(i,1,n - 1) {
			int u = in(),v = in(),w = in();
			edges[i] = {u,v};
			g[u].push_back({v,w});
			g[v].push_back({u,w});
		}
		dep[1] = 0; dfs1(1,1); dfs2(1,1);
		char opt[14];
		while(~scanf("%s",opt + 1)) {
			if(!strcmp(opt + 1,"DONE")) break;
			else if(!strcmp(opt + 1,"CHANGE")) {
				int a = in(),b = in();
				MODIFY(a,b);
			} else {
				int a = in(),b = in();
				printf("%d\n",QUERY(a,b));
			}
		}
	}
	return 0;
}

将 T 的值改为 11 后镜像过了,但是这里死活过不去

2021/12/28 15:42
加载中...