65pts,求助
查看原帖
65pts,求助
754856
_zexal_楼主2023/5/27 00:12

用的wqs二分,为啥错了.

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F(i,a,b) for(int i=(a);i<=(b);i++)
const int Maxn=2e5+5;
int sum,cnt,now,Ans;
int v,e,need,f[Maxn];
struct node {
	int s,t,c,col;
} a[Maxn];
inline int find(int x) {
	if(x==f[x]) return x;
	else return f[x]=find(f[x]);
}
bool cmp(node a,node b) {
	return a.c<b.c;
}
inline void check() {
	sort(a+1,a+e+1,cmp);
	for(int i=1; cnt!=v-1; i++) {
		int x=find(a[i].s),y=find(a[i].t);
		if(x==y) continue;
		cnt++;
		f[x]=y;
		if(a[i].col==0) now++;
		sum+=a[i].c;
	}
}
signed main() {
	cin>>v>>e>>need;
	F(i,1,e) {
		cin>>a[i].s>>a[i].t>>a[i].c>>a[i].col;
		a[i].s++;
		a[i].t++;
	}
	int l=-114,r=514;
	while(l<=r) {
		int mid = l + r >> 1;
		F(i,1,v+1) f[i]=i;
		F(i,1,e) {
			if(a[i].col==0) a[i].c+=mid;
		}
		now=sum=cnt=0;
		check();
		if(now>=need) l=mid+1,Ans=sum-mid*need;
		else r=mid-1;
		F(i,1,e) {
			if(a[i].col==0) a[i].c-=mid;
		}
	}
	cout<<Ans;
	return 0;
}
2023/5/27 00:12
加载中...