树剖求调
查看原帖
树剖求调
801106
liangjiande楼主2025/7/24 19:06

rt,被Hack了,但只被Hack了,没次数了,不知道错哪了,记录

#include<bits/stdc++.h>
#define ll long long
#define bug cout<<"BUG\n"
#define V vector
using namespace std;
const int N=2e5+10;
struct SegTree{
	struct node{
		int l,r,minn;
	};
	V<node>a;
	SegTree(int _n):a(_n*4+2){}
	inline int ls(int x){return x<<1;}
	inline int rs(int x){return x<<1|1;}
	void push_up(int x){
		a[x].minn=min(a[ls(x)].minn,a[rs(x)].minn);
	}
	void build(int x,int l,int r,V<int>&b){
		a[x].l=l;a[x].r=r;
		if(l==r){
			a[x].minn=b[l];
			return;
		}
		int mid=l+r>>1;
		build(ls(x),l,mid,b);build(rs(x),mid+1,r,b);
		push_up(x);
	}
	int query(int x,int L,int R){
		if(a[x].l>=L&&a[x].r<=R) return a[x].minn;
		int res=1e9+10,mid=(a[x].l+a[x].r)>>1;
		if(L<=mid) res=min(res,query(ls(x),L,R));
        if(R>mid) res=min(res,query(rs(x),L,R));
        return res;
	}
};
using P=array<int,2>;
using T=array<int,3>;
using F=array<int,4>;
V<V<P> >e;
V<T>edge;
V<int>id,val,former,siz,son,fa,dep,top;
void dfs1(int u,int fat){
	fa[u]=fat;
	dep[u]=dep[fat]+1;
	siz[u]=1;
	for(auto i:e[u]){
		int v=i[0],w=i[1];
		if(v==fat)continue;
		former[v]=w;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(!son[u]||siz[son[u]]<siz[v]) son[u]=v;
	}
}
int cnt=0;
void dfs2(int u,int tp){
	top[u]=tp;
	id[u]=++cnt;
	val[cnt]=former[u];
	if(!son[u]) return;
	dfs2(son[u],tp);
	for(auto i:e[u]){
		int v=i[0];
		if(v==fa[u]||v==son[u]) continue;
		dfs2(v,v);
	}
}
int query(SegTree &lls,int u,int v){
	int ans=1e9+10;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		ans=min(ans,lls.query(1,id[top[u]],id[u]));
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	if(u!=v) ans=min(ans,lls.query(1,id[son[u]],id[v]));
	return ans;
}
V<int>fat;
int fin(int x){
	if(fat[x]!=x)fat[x]=fin(fat[x]);
	return fat[x];
}
void kl(int n,int m){
	for(int i=1;i<=n;i++)fat[i]=i;
	sort(edge.begin()+1,edge.end(),greater<T>());
	int tot=0;
	for(int i=1;i<=m;i++){
		int u=edge[i][1],v=edge[i][2],w=edge[i][0];
		if(fin(u)!=fin(v)){
			e[u].push_back({v,w});
			e[v].push_back({u,w});
			tot++;
			fat[fin(u)]=fin(v);
		}
		if(tot==n-1)break;
	}
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n,m;cin>>n>>m;
	e.resize(n+1);edge.resize(m+1);val.resize(n+1);
	fa.resize(n+1);fat.resize(n+1);former.resize(n+1);
	id.resize(n+1);dep.resize(n+1);top.resize(n+1);
	siz.resize(n+1);son.resize(n+1);
	for(int i=1;i<=m;i++){
		cin>>edge[i][1]>>edge[i][2]>>edge[i][0];
	}
	kl(n,m);
	dfs1(1,0);dfs2(1,1);
	SegTree lls(n+1);lls.build(1,1,n,val);
	int q;cin>>q;
	while(q--){
		int u,v;cin>>u>>v;
		if(fin(u)!=fin(v)) cout<<-1<<"\n";
		else cout<<query(lls,u,v)<<"\n";
	}
	return 0;
}
/*
5 4
1 2 1
1 3 1
2 3 1
4 5 5
1
4 5

*/

万能的谷民啊,帮帮孩子吧

2025/7/24 19:06
加载中...