Submission #1199720

#TimeUsernameProblemLanguageResultExecution timeMemory
1199720LudisseyTug of War (BOI15_tug)C++20
100 / 100
1821 ms15608 KiB
#include <bits/stdc++.h>
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
using namespace std;

vector<pair<pair<int,int>,int>> ed;
vector<bool> visit;
vector<unordered_set<int>> vc;


signed main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    int n,k; cin >> n >> k;
    vector<unordered_set<int>> vc(2*n);
    vector<pair<pair<int,int>,int>> ed(2*n);
    vector<bool> visit(2*n,false);
    queue<int> q;
    int sum=0;
    for (int i = 0; i < 2*n; i++)
    {
        int l,r,s; cin >> l >> r >> s; l--; r--;
        ed[i]={{l,r+n},s};
        vc[l].insert(i);
        vc[r+n].insert(i);
    }
    for (int i = 0; i < n*2; i++)
    {
        if(sz(vc[i])==0) {
            cout << "NO\n"; 
            return 0;
        }
        if(sz(vc[i])==1){
            q.push(i);
        }
    }
    while(!q.empty()){
        int u=q.front(); q.pop();
        int j=*vc[u].begin();
        visit[j]=true;
        if(u>=n) {
            sum-=ed[j].second;
            vc[ed[j].first.first].erase(j);
            if(sz(vc[ed[j].first.first])==0) {
                cout << "NO\n"; 
                return 0;
            }else if(sz(vc[ed[j].first.first])==1){
                q.push(ed[j].first.first);
            }
        }
        else {
            sum+=ed[j].second;
            vc[ed[j].first.second].erase(j);
            if(sz(vc[ed[j].first.second])==0) {
                cout << "NO\n"; 
                return 0;
            }else if(sz(vc[ed[j].first.second])==1){
                q.push(ed[j].first.second);
            }
        }
        vc[u].clear();
    }
    vector<int> a;
    for (int i = 0; i < 2*n; i++)
    {
        if(sz(vc[i])==2){
            int sm=0;
            int j=*(vc[i].begin());
            int u=0;
            if(i<n){
                sm+=ed[j].second;
                u=ed[j].first.second;
                vc[ed[j].first.second].erase(j);
            }else{
                sm-=ed[j].second;
                u=ed[j].first.first;
                vc[ed[j].first.first].erase(j);
            }
            queue<int> q;
            vc[i].erase(j);
            while(true){
                if(sz(vc[u])==0) break;
                j=*(vc[u].begin());
                if(u<n){
                    sm+=ed[j].second;
                    u=ed[j].first.second;
                    vc[ed[j].first.second].erase(j);
                }else{
                    sm-=ed[j].second;
                    u=ed[j].first.first;
                    vc[ed[j].first.first].erase(j);
                }
            
            }
            a.push_back(abs(sm));
        }
    }
    sort(all(a));
    const int mx=3e4*20;
    bitset<2*mx> dp(0);
    dp[sum+mx]=1;
    for (int i = 0; i <= sz(a); i++)
    {
        dp=(dp<<a[i])|(dp>>a[i]);
    }
    for (int i = mx-k; i <= mx+k; i++)
    {
        if(dp[i]) {cout << "YES\n"; return 0; }
    }
    
    cout << "NO\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...