刚学点分树,WA+TLE 12pts 求助
查看原帖
刚学点分树,WA+TLE 12pts 求助
681036
OldDriverTree楼主2024/3/3 20:04

rt,思路是对每个点维护点分树中子树内白点到当前点距离的 set,对每个点的答案再维护一个 set

#include<bits/stdc++.h>
#define P pair<int,int>
#define v e.first
#define w e.second
using namespace std;
const int N=1e5+1;
int a[N],fa[N],siz[N],top[N];
int n,m,cnt,Fa[N],dep[N],dis[N];
multiset<int> S[N],anS;
vector<int> G[N];
vector<P> g[N];
bool del[N];

void dfs1(int u) {
	siz[u]=1; for (auto e:g[u]) if (v^fa[u])
	fa[v]=u,dis[v]=dis[u]+w,dep[v]=dep[u]+1,dfs1(v),siz[u]+=siz[v];
}
void dfs2(int u,int son=0) {
	for (auto e:g[u]) if (v^fa[u]&&siz[v]>siz[son]) son=v;
	for (auto e:g[u]) if (v^fa[u]&&v^son) top[v]=v,dfs2(v);
	if (son) top[son]=top[u],dfs2(son);
}
void get_size(int u,int fa) {
	siz[u]=1; for (auto e:g[u]) if (v^fa&&!del[v])
	get_size(v,u),siz[u]+=siz[v];
}
void get_root(int u,int fa,int Siz,int &root) {
	int sz=Siz-siz[u]; for (auto e:g[u]) if (v^fa&&!del[v])
	get_root(v,u,Siz,root),sz=max(sz,siz[v]); if (sz<<1<=Siz) root=u;
}
int build(int u) {
	get_size(u,0),get_root(u,0,siz[u],u),del[u]=true;
	for (auto e:g[u]) if (!del[v]) G[u].push_back(build(v) ); return u;
}
int Dis(int x,int y)
{
	int a=x,b=y;
	while (top[x]^top[y]) {
		if (dep[top[x] ]<dep[top[y] ]) swap(x,y);
		x=fa[top[x] ];
	}
	int LCA=dep[x]<dep[y]?x:y;
	return dis[a]+dis[b]-dis[LCA]*2;
}
void Dfs(int u,int rt) {
	for (int to:G[u]) Dfs(to,rt);
	S[rt].insert(Dis(u,rt) );
}
int f(int rt) {
	if (S[rt].size()<2) return INT_MIN;
	auto it=S[rt].rbegin(); it++;
	return *S[rt].rbegin()+*it;
}
void dfs(int u) {
	for (int to:G[u]) Fa[to]=u,dfs(to);
	Dfs(u,u),anS.insert(f(u) );
}
void change(int x)
{
	int u=x;
	while (u) {
		auto it=anS.find(f(u) ); anS.erase(it);
		int d=Dis(x,u); if (a[x]) S[u].insert(d);
		else it=S[u].find(d),S[u].erase(it);
		anS.insert(f(u) ),u=Fa[u];
	}
	if (a[x]) cnt++;
	else cnt--;
	a[x]^=1;
}
int main()
{
	cin.tie(0),cin>>n,cnt=n;
	for (int i=1;i<n;i++) {
		int x,y,z; cin>>x>>y>>z;
		g[x].push_back({y,z}),g[y].push_back({x,z});
	}
	dfs1(1),top[1]=1,dfs2(1);
	dfs(build(1) ),cin>>m;
	while (m--) {
		char c; int x; cin>>c;
		if (c=='C') cin>>x,change(x);
		else {
			if (!cnt) puts("They have disappeared.");
			else if (cnt>1) printf("%d\n",max(*anS.rbegin(),0) );
			else puts("0");
		}
	}
	return 0;
}
2024/3/3 20:04
加载中...