testcase 15 之后全 WA 但是调不出来
查看原帖
testcase 15 之后全 WA 但是调不出来
562119
xzy090626七里香楼主2025/1/4 11:45

如题,二分上界应该是对的/yun

#include<bits/stdc++.h>
#define pii pair<int,int>
#define pi pair<pii,pii>
#define x first
#define y second
#define pb push_back
using namespace std;
const int N = 1e6 + 7;
int n,m,q;
pii a[N];
pii stk[N]; int tp;
int fa[N],siz[N];
int find(int x){
	if(x==fa[x]) return x;
	return find(fa[x]);
}
void Merge(int x,int y){
	x = find(x), y = find(y);
	if(x==y) return;
	if(siz[x]<siz[y]) swap(x,y);
	fa[y] = x;
	siz[x] += siz[y];
	stk[++tp] = {x,y};
}
void Pop(){
	int x = stk[tp].x, y = stk[tp].y;
	fa[y] = y;
	siz[x] -= siz[y];
	tp--;
}
int p;
int ans[N];
void solve(int l,int r,vector<pi>vec){
	if(!vec.size()) return;
	if(l==r){
		for(auto c:vec) ans[c.y.y] = l;
		return;
	}
	int mid = (l+r)/2;
	vector<pi>vl,vr;
	while(p<mid) p++,Merge(a[p].x,a[p].y);
	while(p>mid) Pop(),p--;
	for(auto c:vec){
		if((find(c.x.x)==find(c.x.y) && siz[find(c.x.x)]>=c.y.x) || (find(c.x.x)!=find(c.x.y) && siz[find(c.x.x)]+siz[find(c.x.y)]>=c.y.x)) vl.push_back(c);
		else vr.push_back(c);
	}
	solve(l,mid,vl);
	solve(mid+1,r,vr);
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>m;
	for(int i=1;i<=n;++i) siz[i] = 1,fa[i] = i;
	for(int i=1;i<=m;++i) cin>>a[i].x>>a[i].y;
	cin>>q;
	vector<pi>vec(q);
	for(int i=0;i<q;++i){
		cin>>vec[i].x.x>>vec[i].x.y>>vec[i].y.x;
		vec[i].y.y = i + 1;
	}
	solve(1,m,vec);
	for(int i=1;i<=q;++i) cout<<ans[i]<<'\n';
	return 0;
}
2025/1/4 11:45
加载中...