WQS的疑惑
查看原帖
WQS的疑惑
651786
yyc_楼主2023/3/26 09:44
/*YYC is Thinking Here*/
#include<bits/stdc++.h>
#define deb(var) cerr<<#var<<'='<<var<<'\n'
#define pii pair<int,int>
#define tpiiii tuple<int,int,int,int>
using namespace std;
const int maxn = 2e5+10,inf = 0x3f3f3f3f,maxc = 100;
int n,m,s,t,u,v,c,col,lim,fa[maxn],rk[maxn],cnta,cntb;
int getfa(int u) { return fa[u] == u ? u : fa[u] = getfa(fa[u]); }

tpiiii ea[maxn],eb[maxn],ec[maxn];
inline void addedge(int u,int v,int c,bool col) { (!col?ea[++cnta]:eb[++cntb]) = tpiiii{c,u,v,!col}; }
inline pii krust() {
    int ans = 0,cnt = 0;
    for(int i = 1;i<=n+2;++i) fa[i] = i,rk[i] = 1;
    for(int w,u,v,c,i = 1;i<=m;++i) {
        tie(w,u,v,c) = ec[i];
        int ufa = getfa(u),vfa = getfa(v);
        if(ufa == vfa) continue;
        if(rk[ufa] > rk[vfa]) swap(u,v);
        fa[ufa] = vfa, rk[vfa] += rk[ufa];
        cnt += c; ans += w;
    }
    return {cnt,ans};
}
inline void merge(int k) {
    int i = 1,j = 1;
    for(int p = 1;p<=m;++p) {
        int aw = get<0>(ea[i]),
            bw = get<0>(eb[j]);
        if(aw + k <= bw) ec[p] = ea[i++];
        else ec[p] = eb[j++];
    }
}
signed main(){
    cin>>n>>m>>lim;
    for(int i = 1;i<=m;++i) {
        cin>>s>>t>>c>>col;
        ++s,++t;
        addedge(s,t,c,col);
    }
    ea[++cnta] = eb[++cntb] = tpiiii{inf,inf,inf,inf};
    sort(ea+1,ea+cnta+1),sort(eb+1,eb+cntb+1);
    int l = -maxc,r = maxc,cnt,ans,mid;
    while(l < r) {
        mid = l + r + 1 >> 1;
        merge(mid);
        tie(cnt,ans) = krust();
        if(cnt <= lim) r = mid - 1;
        else l = mid;
    }
    cout<<ans + mid*(cnt-lim);
}

WA 70pts

2023/3/26 09:44
加载中...