悬关求调
查看原帖
悬关求调
1124940
glacier_001楼主2024/8/25 15:49

WA了0分,能过样例

#include<iostream>
#include<vector>
#include<set>
#define N 100005
using namespace std;
int n,m,a[N],b[N],fa[N][25];
long long f[N],dp[N],tot;
struct edge{
	int to;
	long long w;
};
vector<edge> g[N];
bool vis[N];
set<int> s;
set<int>::iterator it;
long long ans;
void dfs(int x,int u){
	fa[u][0]=x;
	dp[u]=dp[x]+1;
	a[u]=++tot;
	b[tot]=u;
	for(int i=1;i<=20;i++){
		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	for(int i=0;i<g[u].size();i++){
		if(g[u][i].to!=x){
			f[g[u][i].to]=f[u]+g[u][i].w;
			dfs(u,g[u][i].to);
		}
	}
}
int lca(int x,int y){
	if(dp[x]<dp[y]) swap(x,y);
	for(int i=20;i>=0;i--){
		if(dp[fa[x][i]]>=dp[y]) x=fa[x][i];
	}
	if(x==y) return x;
	for(int i=20;i>=0;i--){
		if(dp[fa[x][i]]!=dp[fa[y][i]]){
			x=fa[x][i],y=fa[y][i];
		}
	}
	return fa[x][0];
}
long long dist(int x,int y){
	return f[x]+f[y]-2*f[lca(x,y)];
}
int main(){
	cin>>n>>m;
	for(int i=1,x,y,z;i<n;i++){
		cin>>x>>y>>z;
		g[x].push_back((edge){y,z});
		g[y].push_back((edge){x,z});
	}
	dfs(0,1);
	for(int i=1,x,y,z;i<=m;i++){
		cin>>x;
		x=a[x];
		if(!vis[b[x]]) s.insert(x);
		it=s.lower_bound(x);
		if(it==s.begin()) y=b[*--s.end()];
		else y=b[*--it];
		it=s.upper_bound(x);
		if(it==s.end()) z=b[*s.begin()];
		else z=b[*it];
		if(vis[b[x]]) s.erase(x);
		x=b[x];
		long long dis=dist(x,y)+dist(x,z)-dist(y,z);
		if(!vis[x]) ans+=dis,vis[x]=true;
		else ans-=dis,vis[x]=false;
		cout<<ans<<endl;
	}
	return 0;
}

悬2关,感激不尽

2024/8/25 15:49
加载中...