Test 15以后全WA
查看原帖
Test 15以后全WA
271096
Semorius楼主2022/11/12 10:30

但对拍了4000组没拍出来,求调kruskal重构树

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define l(x) x<<1
#define r(x) x<<1|1
#define mpr make_pair
//mt19937_64 ra(time(0) ^ (*new char));
const int SIZE = 1000005;
const int mod = 998244353;
int n, m;
int head[SIZE], ver[SIZE*2], nxt[SIZE*2], tot;
int fa[SIZE], totv, siz[SIZE];
int d[SIZE], f[SIZE][30];
int a[SIZE];

inline int rd(){
	int f = 1, x = 0;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9'){
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return f*x;
}

int power(int x, int y){
	int jl = 1;
	while(y){
		if(y&1) jl = (jl * x) % mod;
		x = (x * x) % mod;
		y >>= 1;
	}
	return jl;
}

void add(int x, int y){
//	cout << x << " " << y << endl;
	ver[++tot] = y, nxt[tot] = head[x];
	head[x] = tot;	
}

struct E{
	int x, y, val;
}e[SIZE];

bool cmp(E x, E y){
	return x.val < y.val;	
}

int get(int x){
	if(x == fa[x]) return x;
	return fa[x] = get(fa[x]);	
}

void dfs(int x, int ffa){
	d[x] = d[ffa] + 1, f[x][0] = ffa;	
	for(int i = 1; i <= 24; i++) f[x][i] = f[f[x][i-1]][i-1]; 
	bool ff = 0;
	for(int i = head[x]; i; i = nxt[i]){
		int y = ver[i];
		if(y == ffa) continue;
		dfs(y, x);
		ff = 1;
		siz[x] += siz[y];
	}
	if(!ff) siz[x] = 1;
}

bool check(int x, int y, int mid, int kk){
	int nowx = x;
	for(int i = 24; i >= 0; i--) 
		if(a[f[nowx][i]] <= mid){
			nowx = f[nowx][i];
		}
	int nowy = y;
	for(int i = 24; i >= 0; i--) 
		if(a[f[nowy][i]] <= mid){
			nowy = f[nowy][i];
		}
//	if(a[nowy] > a[nowx]) swap(nowx, nowy);
//	cout << mid << " " << nowx << " " << siz[nowx] << endl;
	if(nowx == nowy) return siz[nowx] >= kk;
	else return siz[nowx] + siz[nowy] >= kk;
}

int main(){
//	freopen("In.in", "r", stdin);
//	freopen("My.out", "w", stdout);
	n = rd(), m = rd();
	for(int i = 1; i <= m; i++){
		e[i].x = rd(), e[i].y = rd(), e[i].val = i;
	}
	sort(e+1, e+m+1, cmp);
	for(int i = 1; i <= 2*n; i++) fa[i] = i;
	totv = n;
	memset(a, 0x3f, sizeof(a));
	for(int i = 1; i <= n; i++){
		int x = e[i].x, y = e[i].y, val = e[i].val;
		int xx = get(x), yy = get(y);
		if(xx == yy) continue;
		totv++;
		fa[xx] = totv;
		fa[yy] = totv;
		a[totv] = val;
//		cout << totv << "    " << a[totv] << endl;
		add(xx, totv); add(totv, xx);
		add(yy, totv); add(totv, yy);
	}
	dfs(totv, 0);
	int T = rd();
	while(T--){
		int x = rd(), y = rd(), kk = rd();
		int l = 1, r = m, ans = m;
		while(l <= r){
			int mid = (l + r) >> 1;
			if(check(x, y, mid, kk)) r = mid - 1, ans = mid;
			else l = mid + 1;
		}
		printf("%d\n", ans);
	}
	return 0;
}

2022/11/12 10:30
加载中...