树剖求调
查看原帖
树剖求调
935656
Luner楼主2024/11/4 21:00

思路就是 0 代表关,1 代表开,然后树剖,线段树问维护区间修改和查询,但是程序卡死了,求大佬帮忙 qwq

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define L(i,l,r) for(int i=l;i<=r;i++)
#define R(i,r,l) for(int i=r;i>=l;i--)
const int N=1e5+10;
int n;
vector<int> G[N];
struct Node {
	int l,r;
	int d,lzy;
};
struct SEG {
#define ls (u<<1)
#define rs (u<<1|1)
	Node tr[N<<2];
	void pushup(int u) {
		tr[u].d=tr[ls].d+tr[rs].d;
	}
	void build(int u,int l,int r) {
		if(l==r) {
			tr[u]= {l,r,0,-1};
			return;
		}
		tr[u]= {l,r,0,-1};
		int mid=l+r>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
		pushup(u);
	}
	void maketag(int u,int x) {
		int l=tr[u].l,r=tr[u].r;
		int len=r-l+1;
		tr[u].lzy=x;
		tr[u].d=len*x;
	}
	void pushdown(int u) {
		if(tr[u].lzy!=-1) {
			maketag(ls,tr[u].lzy);
			maketag(rs,tr[u].lzy);
			tr[u].lzy=-1;
		}
	}
	int query(int u,int l,int r) {
		if(tr[u].l>=l&&tr[u].r<=r) {
			return tr[u].d;
		}
		pushdown(u);
		int res=0,mid=tr[u].l+tr[u].r>>1;
		if(l<=mid) res=res+query(ls,l,r);
		if(r>mid) res=res+query(rs,l,r);
		return res;
	}
	void update(int u,int l,int r,int x) {
		if(tr[u].l>=l&&tr[u].r<=r) {
			maketag(u,x);
			return;
		}
		pushdown(u);
		int res=0,mid=tr[u].l+tr[u].r>>1;
		if(l<=mid) update(ls,l,r,x);
		if(r>mid) update(rs,l,r,x);
		pushup(u);
	}
} T;
int hson[N],siz[N],fa[N],depth[N];
int top[N],id[N],timestamp;
void dfs1(int u,int f,int dep){
	siz[u]=1;
	fa[u]=f;
	depth[u]=dep;
	int mx=-1;
	for(auto v:G[u]){
		if(v==f) continue;
		dfs1(v,u,dep+1);
		siz[u]+=siz[v];
		if(siz[v]>mx){
			mx=siz[v];
			hson[u]=v;
		}
	}
}
void dfs2(int u,int tp){
	id[u]=++timestamp;
	top[u]=tp;
	if(!hson[u]) return;
	dfs2(hson[u],tp);
	for(auto v:G[u]){
		if(v==fa[u]||v==hson[u]) continue; 
		dfs2(v,v);
	}
}
int qLine(int u,int v) {
	int res=0;
	while(top[u]!=top[v]) {
		if(depth[top[u]]<depth[top[v]]) swap(u,v);
		res=res+T.query(1,id[top[u]],id[u]);
		u=fa[top[u]];
	}
	if(depth[u]>depth[v]) swap(u,v);
	res=res+T.query(1,id[u],id[v]);
	return res;
}
void updLine(int u,int v,int x) {
	while(top[u]!=top[v]) {
		if(depth[top[u]]<depth[top[v]]) swap(u,v);
		T.update(1,id[top[u]],id[u],x);
		u=fa[top[u]];
	}
	if(depth[u]>depth[v]) swap(u,v);
	T.update(1,id[u],id[v],x);
}
int qSon(int u) {
	return T.query(1,id[u],id[u]+siz[u]-1);
}
void updSon(int u,int x) {
	T.update(1,id[u],id[u]+siz[u]-1,x);
}
signed main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin>>n;
	L(u,2,n){
		int v;
		cin>>v;
		v++;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	T.build(1,1,n);
	dfs1(1,0,1);
	dfs2(1,1);
	int mm;
	cin>>mm;
	while(mm--){
		string opt;
		int x;
		cin>>opt>>x;
		if(opt=="install"){
			int res=qLine(1,x);
			updLine(1,x,1);
			cout<<qLine(1,x)-res<<'\n';
		}else{
			cout<<qSon(x)<<'\n';
			updSon(x,0);
		}
	}
	return 0;
}
2024/11/4 21:00
加载中...