Submission #1323702

#TimeUsernameProblemLanguageResultExecution timeMemory
1323702viyeuquadamdauTug of War (BOI15_tug)C++20
18 / 100
228 ms327680 KiB
// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/allocator.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,avx2,popcnt,lzcnt")

#include <bits/stdc++.h>
using namespace std;

// #define int long long
#define ll long long
#define vec vector
#define PB push_back
#define all(x) x.begin(), x.end()
#define F first
#define S second
#define ull unsigned long long
#define pii pair<int, int>
#define rz resize
#define ld long double  
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define matrix vec<vec<int>>
#define MP make_pair

const int N = 2*(3e4+5);
const int MAXN=1e6+2;
const ll inf = 1e18;
const ll mod = 1000000007;

int add(int a, int b){ a+=b;if(a>=mod)a-=mod;return a; }
int mul(int a, int b){ a*=b;if(a>=mod)a%=mod;return a; }
int sub(int a, int b){ a-=b;if(a<0)a+=mod;return a; }

vec<pii>gr[N];

int tin[N];
pii par[N];
int n,k;

int A[N],B[N],S[N];
bool in_cycle[N];

int tplt=0,numdfs=0;
vec<pii>cycle;

void dfs(int u, int p=0){
    tin[u]=++numdfs;
    for(pii& v: gr[u])if(v.S!=p){
        if(!tin[v.F])par[v.F]={u,v.S},dfs(v.F,v.S);
        else if(tin[v.F] < tin[u]) {
            cycle={{v.F,v.S}};
            in_cycle[v.F]=1;
            int t=u;
            while(t!=v.F){
                in_cycle[t]=1;
                cycle.PB({t,par[t].S});
                t=par[t].F;
            }
        }
    }
}

void dfs_tree(int u, int val, int p=0){
    if(u <= n)A[tplt]+=val,B[tplt]+=val;
    for(pii v: gr[u])if(v.F!=p)dfs_tree(v.F,S[v.S],u);
}

void process_cycle(){
    for(pii i: cycle){
        int u=i.F;
        for(pii v: gr[u])if(!in_cycle[v.F])dfs_tree(v.F,S[v.S],u);
    }
    int len=cycle.size();
    for(int i=0;i<len;++i){
        int val=S[cycle[i].S];
        int u=cycle[i].F,v=cycle[(i+1)%len].F;
        // cout<<cycle[i].S<<' '<<S[cycle[i].S]<<'\n';
        if(u <= n)B[tplt]+=val;
        if(v <= n)A[tplt]+=val;
    }
}

const int M = 10*N;
int f[M];

signed main() {
    ios::sync_with_stdio(0);cin.tie(0);
    // freopen("Toll.INP","r",stdin);
    // freopen("Toll.out","w",stdout);
    cin>>n>>k;
    int tot=0;
    for(int i=1;i<=2*n;++i){
        int u,v;cin>>u>>v>>S[i];gr[u].PB({n+v,i});gr[n+v].PB({u,i});
        // cout<<u<<' '<<n+v<<' '<<s<<'\n';
        tot+=S[i];
    }
    // for(int i=1;i<=n+n;++i){
    //     for(pii v: gr[i])cout<<i<<' '<<v.F<<'\n';
    //     cout<<"\n\n";
    // }
    for(int i=1;i<=n+n;++i)if(!tin[i]){
        ++tplt;
        dfs(i);
        process_cycle();
    }
    bitset<M>dp;
    int base=0;
    for(int i=1;i<=tplt;++i)base+=min(A[i],B[i]),f[abs(A[i]-B[i])]++;
    int idx_C=0;
    dp[0]=1;
    for(int i=1;i<M;++i)if(f[i]){
        int p=1;
        while(f[i]>=p){
            // idx_C[++idx_C]=i*p;
            dp|=(dp << (i*p));
            f[i]-=p;p<<=1;
        }
        if(f[i]>0)dp|=(dp << (i*f[i])),f[i]=0; 
    }
    // for(int i=1;i<=idx_C;++i)dp=(dp | (dp<<C[i]));
    bool ok=0;
    for(int i=base;i<=tot;++i)if(dp[i-base] && abs(2*i - tot) <= k){ok=1;break;}
    if(ok)yes;
    else no;

    cerr<<"ok\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...