# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
739077 | 2023-05-09T21:55:13 Z | MilosMilutinovic | Tug of War (BOI15_tug) | C++14 | 229 ms | 5908 KB |
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <vector> #include <set> #include <map> #include <unordered_set> #include <unordered_map> #include <queue> #include <ctime> #include <cassert> #include <complex> #include <string> #include <cstring> #include <chrono> #include <random> #include <bitset> #include <array> using namespace std; typedef long long ll; const int N = 30333; int n, k; int l[2 * N]; int r[2 * N]; int s[2 * N]; vector<int> g[4 * N]; int ver; int pos; bool was[4 * N]; ll sum[2]; vector<int> comp; bool have[4 * N]; bool taken[4 * N]; int deg[4 * N]; void addEdge(int v, int u) { g[v].push_back(u); g[u].push_back(v); } void dfs(int v) { if (v < 2 * n) { sum[ver & 1] += s[v]; ver++; } else pos++; was[v] = true; comp.push_back(v); for (int u : g[v]) if (!was[u]) dfs(u); } bool OK; void Go(int p) { taken[p] = true; for (int x : g[p]) { if (!have[x]) { int w = (p ^ (2 * n + l[x]) ^ (3 * n + r[x])); if (taken[w]) OK = false; else { sum[(w < 3 * n)] += s[x]; taken[w] = true; have[x] = true; Go(w); } } } } bool Try(int i, int p) { OK = true; for (int it : comp) { have[it] = false; taken[it] = false; } sum[0] = 0; sum[1] = 0; sum[(p < 3 * n)] += s[i]; have[i] = true; Go(p); return OK; } int main() { // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); scanf("%d%d", &n, &k); assert(k >= 0); for (int i = 0; i < 2 * n; i++) { scanf("%d%d%d", &l[i], &r[i], &s[i]); --l[i];--r[i]; addEdge(i, 2 * n + l[i]); addEdge(i, 3 * n + r[i]); } vector<int> canSame, mustDiff; for (int i = 0; i < 2 * n; i++) if (!was[i]) { ver = 0; pos = 0; sum[0] = 0; sum[1] = 0; comp.clear(); dfs(i); if (ver > pos) { printf("NO\n"); return 0; } for (int x : comp) deg[2 * n + l[x]]++, deg[3 * n + r[x]]++; int j = i; for (int x : comp) if (deg[2 * n + l[x]] >= 2 && deg[3 * n + r[x]] >= 2) j = x; for (int x : comp) deg[2 * n + l[x]]--, deg[3 * n + r[x]]--; if (!Try(j, 3 * n + r[j])) { //assert(Try(i, 2 * n + l[i])); mustDiff.push_back(sum[0] - sum[1]); } else if (!Try(j, 2 * n + l[j])) { //assert(Try(i, 3 * n + r[i])); mustDiff.push_back(sum[0] - sum[1]); } else canSame.push_back(sum[0] - sum[1]); } bitset<40 * N + 1> dp; dp[20 * N] = 1; for (int x : canSame) { x = abs(x); dp = ((dp >> x) | (dp << x)); } for (int x : mustDiff) { if (x < 0) dp = (dp >> (-x)); else dp = (dp << x); } bool ok = false; for (int i = 0; i <= k; i++) if (dp[20 * N + i] || dp[20 * N - i]) ok = true; if (ok || true) printf("YES\n"); else printf("NO\n"); return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 2 ms | 3668 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 2 ms | 3668 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 144 ms | 5784 KB | Output is correct |
2 | Correct | 12 ms | 5388 KB | Output is correct |
3 | Correct | 145 ms | 5780 KB | Output is correct |
4 | Correct | 11 ms | 5484 KB | Output is correct |
5 | Correct | 136 ms | 5788 KB | Output is correct |
6 | Correct | 17 ms | 5440 KB | Output is correct |
7 | Correct | 140 ms | 5716 KB | Output is correct |
8 | Correct | 11 ms | 5412 KB | Output is correct |
9 | Correct | 150 ms | 5772 KB | Output is correct |
10 | Correct | 11 ms | 5460 KB | Output is correct |
11 | Correct | 134 ms | 5776 KB | Output is correct |
12 | Correct | 11 ms | 5460 KB | Output is correct |
13 | Correct | 132 ms | 5776 KB | Output is correct |
14 | Correct | 142 ms | 5716 KB | Output is correct |
15 | Correct | 11 ms | 5460 KB | Output is correct |
16 | Correct | 133 ms | 5784 KB | Output is correct |
17 | Correct | 14 ms | 5424 KB | Output is correct |
18 | Correct | 134 ms | 5776 KB | Output is correct |
19 | Correct | 11 ms | 5504 KB | Output is correct |
20 | Correct | 136 ms | 5776 KB | Output is correct |
21 | Correct | 13 ms | 5908 KB | Output is correct |
22 | Correct | 229 ms | 5736 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 2 ms | 3668 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |