Submission #1149272

#TimeUsernameProblemLanguageResultExecution timeMemory
114927212345678Tug of War (BOI15_tug)C++20
0 / 100
145 ms5872 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=6e4+5, kx=6e5+5;

int n, k, l[nx], r[nx], s[nx], vs[nx], f, dif, tmp, v[nx], cnt, res=1e9, tst;
set<int> deg[nx];
bitset<kx> dp[2];

void solve(int x, int idx)
{
    if (l[x]==idx)
    {
        dif+=s[x];
        deg[r[x]].erase(idx);
        if (deg[r[x]].empty()) f=1;
        else if (deg[r[x]].size()==1) solve(*deg[r[x]].begin(), r[x]);
    }
    else
    {
        dif-=s[x];
        deg[l[x]].erase(idx);
        if (deg[l[x]].empty()) f=1;
        else if (deg[l[x]].size()==1) solve(*deg[l[x]].begin(), l[x]);
    }
}

void dfs(int u, int p, int t)
{
    if (t==0)
    {
        if (vs[u]) return;
        tst++;
        vs[u]=1;
        if (l[u]!=p) tmp+=s[u], dfs(l[u], u, 1);
        else tmp-=s[u], dfs(r[u], u, 1);
    }
    else
    {
        if (deg[u].size()!=2) cout<<1/0;
        if (*deg[u].begin()==p) dfs(*next(deg[u].begin()), u, 0);
        else dfs(*deg[u].begin(), u, 0);
    }
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>k;
    for (int i=1; i<=2*n; i++) cin>>l[i]>>r[i]>>s[i], r[i]+=n, deg[l[i]].insert(i), deg[r[i]].insert(i);
    for (int i=1; i<=2*n; i++) if (deg[i].empty()) return cout<<"NO", 0;
    for (int i=1; i<=2*n; i++) if (deg[i].size()==1&&!f) solve(*deg[i].begin(), i);
    if (f) return cout<<"NO", 0;
    for (int i=1; i<=2*n; i++)
    {
        if (!vs[i]&&deg[i].size()==2)
        {
            tmp=tst=0;
            dfs(i, -1, 0);
            //if (tmp!=0) cout<<1/0;
            //if (tst%2) cout<<1/0;
            v[++cnt]=tmp;
        }
    }
    dp[0][300000]=1;
    for (int i=1; i<=cnt; i++)
    {
        int cur=i%2, pv=1-cur;
        dp[cur]=(dp[pv]>>abs(v[i]))|(dp[pv]<<abs(v[i]));
        //cout<<"tmp "<<i<<' '<<v[i]<<'\n';
        //for (int j=-10; j<=10; j++) cout<<dp[cur][300000+j]<<' ';
        //cout<<'\n';
    }
    for (int i=0; i<kx; i++) if (dp[cnt%2][i]) res=min(res, abs(dif+(300000-i)));
    //cout<<"here "<<res<<'\n';
    if (res<=k) cout<<"YES";
    else cout<<"NO";

}

/*
2 20
1 1 1
1 2 4
2 2 1
2 1 4

*/

Compilation message (stderr)

tug.cpp: In function 'void dfs(int, int, int)':
tug.cpp:41:38: warning: division by zero [-Wdiv-by-zero]
   41 |         if (deg[u].size()!=2) cout<<1/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...