社区讨论
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 条回复,欢迎继续交流。
正在加载回复...