Submission #104619

#TimeUsernameProblemLanguageResultExecution timeMemory
104619alexpetrescuTug of War (BOI15_tug)C++14
100 / 100
2295 ms5368 KiB
#include <cstdio>
#include <bitset>
#include <vector>
#include <cstdlib>
#include <algorithm>

//FILE *fin = fopen("a.in", "r"), *fout = fopen("a.out", "w");
#define fin stdin
#define fout stdout

#define MAXN 60009
#define MAXS 1170009

std::bitset < MAXS > d;
bool cuplat[MAXN], done[MAXN];
int gr[MAXN], D, q[MAXN], add[MAXN];
int n, l[MAXN], r[MAXN], s[MAXN];
std::vector < int > g[MAXN];

inline void go(int x) {
    while (x) {
        int a = l[x];
        if (cuplat[a])
            a = r[x];
        if (cuplat[a])
            exit(1);
        cuplat[a] = 1;
        done[x] = 1;
        if (a <= n)
            D -= s[x];
        else
            D += s[x];
        x = 0;
        for (auto &y : g[a])
            if (done[y] == 0)
                x = y;
    }
}

int main() {
    int k;
    fscanf(fin, "%d%d", &n, &k);

    for (int i = 1; i <= 2 * n; i++) {
        fscanf(fin, "%d%d%d", &l[i], &r[i], &s[i]);
        r[i] += n;
        g[l[i]].push_back(i);
        g[r[i]].push_back(i);
    }

    for (int i = 1; i <= 2 * n; i++)
        gr[i] = g[i].size();

    int st = 0, dr = 0;
    for (int i = 1; i <= 2 * n; i++)
        if (gr[i] <= 1)
            q[dr++] = i;

    int dif = 0;
    while (st < dr) {
        int x = q[st++];
        if (gr[x] == 0) {
            fprintf(fout, "NO");
            return 0;
        }
        cuplat[x] = 1;
        int nod = 0;
        for (auto &y : g[x])
            if (done[y] == 0)
                nod = y;
        if (nod == 0)
            exit(2);
        done[nod] = 1;
        int z = l[nod] ^ r[nod] ^ x;
        gr[z]--;
        if (gr[z] == 1)
            q[dr++] = z;
        if (x <= n)
            dif -= s[nod];
        else
            dif += s[nod];
    }

    for (int i = 1; i <= 2 * n; i++) {
        if (done[i] == 0) {
            D = 0;
            go(i);
            if (D < 0)
                D = -D;
            dif -= D;
            add[++add[0]] = 2 * D;
        }
    }

    int left = -k - dif, right = k - dif;
    if (right < 0)
        fprintf(fout, "NO");
    else if (left <= 0)
        fprintf(fout, "YES");
    else {
        std::sort(add + 1, add + add[0] + 1);
        for (int i = 1; i <= add[0]; i++)
            add[i] /= 2;
        left = (left + 1) / 2;
        right = right / 2;
        d[0] = 1;
        for (int i = 1; i <= add[0]; i++)
            d |= d << add[i];
        bool ans = 0;
        for (int i = left; i <= right; i++)
            ans |= d[i];
        if (ans)
            fprintf(fout, "YES");
        else
            fprintf(fout, "NO");
    }

    fclose(fin);
    fclose(fout);
    return 0;
}

Compilation message (stderr)

tug.cpp: In function 'int main()':
tug.cpp:42:11: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     fscanf(fin, "%d%d", &n, &k);
     ~~~~~~^~~~~~~~~~~~~~~~~~~~~
tug.cpp:45:15: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         fscanf(fin, "%d%d%d", &l[i], &r[i], &s[i]);
         ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...