68pts求条,玄关
查看原帖
68pts求条,玄关
373530
Reply_楼主2025/7/20 14:48
#include<bits/stdc++.h>
#define int long long
#define R1 register
#define F(i,a,b) for(int i = (a);i<=(b);i++)
using namespace std;
inline int read(){R1 int x=0,t=1;R1 char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*t;}
const int N=1e6+10;
int n,qq;
struct Q
{
	int op,u,v,ans;
}q[N];
vector<int>g[N];
void add(int ui,int vi)
{
	
	g[ui].push_back(vi);
//	cout << ui << " " << vi << '\n';
	return;
}
int lowbit(int x)
{
	return x&(-x);
}
int siz[N],dep[N],fa[N],son[N],tot,id[N],b[N],w[N],top[N];
void dfs1(int u,int Fa)
{
	siz[u]=1;
	dep[u]=dep[Fa]+1;
	
	fa[u]=Fa;
	for(int i = 0;i<g[u].size();i++){
		int v=g[u][i];
		if(v==Fa) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v;
	}
	return;
}
void dfs2(int u,int topf)
{
	id[u]=++tot;
	b[tot]=w[u];
	top[u]=topf;
	if(son[u]) dfs2(son[u],topf);
	for(int i = 0;i<g[u].size();i++){
		int v=g[u][i];
		if(id[v]) continue;
		dfs2(v,v);
	}
	return;
}
int c[N],f[N];
void modify(int x,int k)
{
	for(;x<=n;x+=lowbit(x)) c[x]+=k;
	return;
}
int query(int x)
{
	int sum=0;
	for(;x;x-=lowbit(x)) sum+=c[x];
	return sum;
}
int find(int x)
{
	if(x==f[x]) return x;
	return f[x]=find(f[x]);
}
int qRange(int x,int y)
{
	int sum=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		sum+=query(id[x])-query(id[top[x]]-1);
		x=fa[top[x]];
	}
	if(id[x]>id[y])swap(x,y);
	sum+=query(id[y])-query(id[x]-1);
	return sum;
}
signed main()
{
	n=read();
	F(i,1,n) w[i]=read();
	qq=read();
	for(int i = 1;i<=n;i++) f[i]=i;
	for(int i = 1;i<=qq;i++){
		string s;
		cin >> s;
		if(s=="bridge"){
			q[i].op=1,q[i].u=read(),q[i].v=read();
			if(find(q[i].u)==find(q[i].v)){
				q[i].ans=0;
			}
			else{
				q[i].ans=1;
				add(q[i].u,q[i].v);
				add(q[i].v,q[i].u);
				f[find(q[i].u)]=find(q[i].v);
			}
			
		}
		else if(s=="penguins"){
			q[i].op=2,q[i].u=read(),q[i].v=read();
		}
		else{
			q[i].op=3,q[i].u=read(),q[i].v=read();
		}
	}
	for(int i = 1;i<=n;i++){
		if(!siz[i]){
			dfs1(i,0);
			dfs2(i,i);
		}
	}
	F(i,1,n) f[i]=i;
	for(int i = 1;i<=n;i++) modify(i,b[i]);
	for(int i = 1;i<=qq;i++){
		if(q[i].op==1){
			if(find(q[i].u)==find(q[i].v)){
				puts("no");
			}
			else{
				puts("yes");
				f[find(q[i].u)]=find(q[i].v);
			}
		}
		else if(q[i].op==2){
			modify(id[q[i].u],q[i].v-w[q[i].u]);
		}
		else{
			if(find(q[i].u)!=find(q[i].v)){
				puts("impossible");
			}
			else{
				cout << qRange(q[i].u,q[i].v) << '\n';
			}
		}
	}
	return 0;
}
/*

*/

2025/7/20 14:48
加载中...