社区讨论

help! 蒟蒻蜜汁MLE 大佬求调

P2619[国家集训队] Tree I参与者 2已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@lo9m09k1
此快照首次捕获于
2023/10/28 13:36
2 年前
此快照最后确认于
2023/10/28 13:36
2 年前
查看原帖
CPP
#include<bits/stdc++.h>

using namespace std;

int n, m, need, f[50005], white, sum, le, cnt, ans;
struct node{
    int x, y;
    int len;
    int f;
}a[100005];

int find(int x){
	if(f[x] == x){
		return f[x];
	}
	return f[x] = find(x);
}

bool cmp(node x, node y){
    if(x.len == y.len){
        return x.f < y.f;
    }
    return x.len < y.len;
}

void k(){
	for(int i = 1; i <= n; i++){
		f[i] = i;
	}
	sort(a + 1, a + 1 + m, cmp);
	for(int i = 1; i <= m; i++){
		int fx = find(a[i].x);
		int fy = find(a[i].y);
		if(fx == fy){
			continue;
		}
		f[fx] = fy;
		sum += a[i].len;
		cnt ++;
		if(!a[i].f){
			white++;
		}
		if(cnt == n - 1){
			return ;
		}
	}
}

int r(){
    int f = 1, x = 0;
    char c = getchar();
    if(c == '-'){
        f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9'){
        x = x * 10 + (c - '0');
    	c = getchar();
    }
    return x * f;
}
int main(){
    n = r();
    m = r();
    need = r();
    for(int i = 1; i <= m; i++){
    	int bi = r(), fi = r(), v = r(), vis = r();
    	bi++;
    	fi++;
		a[++le].x = bi;
		a[le].y = fi;
		a[le].len = v;
		a[le].f = vis;
	}
	int l = -100, r = 100;
	while(l <= r){
		int mid = (l + r) / 2;
		for(int i = 1; i <= m; i++){
			if(a[i].f == 0){
				a[i].len += mid;
			}
		}
		sum = white = cnt = 0;
		k();
		if(white >= need){
			ans = sum - need * mid;
			l = mid + 1;
		}
		else{
			r = mid - 1;
		}
		for(int i = 1; i <= m; i++){
			if(a[i].f == 0){
				a[i].len -= mid;
			}
		}	
	}
	cout << ans;
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...