Submission #655164

#TimeUsernameProblemLanguageResultExecution timeMemory
655164ParsaSTug of War (BOI15_tug)C++14
100 / 100
947 ms6748 KiB
// In the name of God
#pragma GCC optimize("O2")
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
typedef long long ll;
const int N = 3e4 * 2 + 5, M = 3e4 * 17 + 5;
int n, k, l[N], r[N], s[N];

vector<int> adj[N];
int par[N], cntn, vec[N], ver[N], veci, veri;
int cnt[N][2], h[N];
bool vis[N], mark[N], vis2[N];

int _get(int i, int v) {
    return l[i] == v ? r[i] : l[i];
}
int dfs3(int v) {
    int c = adj[v].size();
    cntn++;
    vis2[v] = true;
    for (auto e : adj[v]) {
        int i = e, u = _get(e, v), w = s[e];
        if (!vis2[u])
            c += dfs3(u);
    }
    return c;
}

void dfs(int v, int p) {
    par[v] = p;
    vis[v] = true;
    for (auto e : adj[v]) {
        int i = e, u = _get(e, v), w = s[e];
        if (p == i)
            continue;
        if (!vis[u]) {
            h[u] = h[v] + 1;
            dfs(u, i);
        }
        else if (h[u] < h[v]) {
            int u2 = _get(i, v), v2 = v;
            ver[veri++] = v;
            while (v2 != u2) {
                vec[veci++] = par[v2];
                v2 = _get(par[v2], v2);
                ver[veri++] = v2;
            }
            vec[veci++] = i;
        }
    }
}

void dfs2(int v) {
    mark[v] = true;
    for (auto e : adj[v]) {
        int i = e, u = _get(i, v), w = s[e];
        if (mark[u])
            continue;
        dfs2(u);
        cnt[v][0] += cnt[u][1];
        cnt[v][1] += cnt[u][0] + w;
    }
}
bitset<M> dp;

void solve() {
    cin >> n >> k;
    int S = 0;
    int tmpp = 1;
    for (int i = 0; i < 2 * n; i++) {
        cin >> l[i] >> r[i] >> s[i];
        S += s[i];
        r[i] += n;
        adj[l[i]].pb(i);
        adj[r[i]].pb(i);
    }
    vector<pair<int, int> > V;
    for (int i = 1; i <= 2 * n; i++) {
        if (!vis[i]) {
            veci = 0, veri = 0;
            cntn = 0;
            int cnte = dfs3(i);
            if (cnte != cntn * 2) {
                cout << "NO" << '\n';
                return;
            }
            dfs(i, -1);


            for (int j = 0; j < veri; j++) {
                int u = ver[j];
                mark[u] = true;
            }
            for (int j = 0; j < veri; j++) {
                int u = ver[j];
                dfs2(u);
            }
            int sum[2] = {0, 0};
            int tmp[2] = {0, 0};
            for (int i = 0; i < veci; i++) {
                sum[i % 2] += s[vec[i]];
                tmp[0] += cnt[ver[i]][i % 2];
                tmp[1] += cnt[ver[i]][(i % 2) ^ 1];
            }
            int x = ver[0] > n;
            V.pb(make_pair(tmp[x] + sum[0], tmp[x] + sum[1]));
        }
    }
    dp[0] = true;
    for (auto [a, b] : V) {
        dp |= (dp << b) | (dp << a);
    }
    for (int i = 0; i < M; i++) {
        if (abs(2 * i - S) <= k && dp[i]) {
            cout << "YES" << endl;
            return;
        }
    }
    cout << "NO";
}
int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    solve();
    return 0;
}

Compilation message (stderr)

tug.cpp: In function 'int dfs3(int)':
tug.cpp:25:13: warning: unused variable 'i' [-Wunused-variable]
   25 |         int i = e, u = _get(e, v), w = s[e];
      |             ^
tug.cpp:25:36: warning: unused variable 'w' [-Wunused-variable]
   25 |         int i = e, u = _get(e, v), w = s[e];
      |                                    ^
tug.cpp: In function 'void dfs(int, int)':
tug.cpp:36:36: warning: unused variable 'w' [-Wunused-variable]
   36 |         int i = e, u = _get(e, v), w = s[e];
      |                                    ^
tug.cpp: In function 'void solve()':
tug.cpp:113:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  113 |     for (auto [a, b] : V) {
      |               ^
tug.cpp:72:9: warning: unused variable 'tmpp' [-Wunused-variable]
   72 |     int tmpp = 1;
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...