# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
120055 | E869120 | Tug of War (BOI15_tug) | C++14 | 222 ms | 31804 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <queue>
#include <set>
using namespace std;
#pragma warning (disable: 4996)
bool dp[2009][80009];
bool solve(int N, int K, vector<pair<int, int>>G) {
dp[0][40000] = true;
for (int i = 0; i < G.size(); i++) {
for (int j = 0; j <= 80000; j++) {
if (dp[i][j] == false) continue;
dp[i + 1][j + G[i].first] = true;
dp[i + 1][j + G[i].second] = true;
}
}
for (int i = 40000 - K; i <= 40000 + K; i++) {
if (dp[G.size()][i] == true) return true;
}
return false;
}
set<pair<int, int>> G[60009];
int N, K, V1, V2, A[60009], B[60009], S[60009]; bool used[60009], colored[60009];
vector<pair<int, int>> X[60009];
int main() {
scanf("%d%d", &N, &K);
for (int i = 1; i <= N * 2; i++) {
scanf("%d%d%d", &A[i], &B[i], &S[i]);
G[A[i]].insert(make_pair(B[i] + N, i));
G[B[i] + N].insert(make_pair(A[i], i));
}
queue<int>Q;
for (int i = 1; i <= 2 * N; i++) {
if (G[i].size() == 1) Q.push(i);
}
while (!Q.empty()) {
int pos = Q.front(); Q.pop();
auto itr = G[pos].begin();
pair<int, int> E = (*itr);
if (pos <= N) V1 += E.second;
else V2 += E.second;
used[E.second] = false; colored[pos] = true;
G[pos].erase(make_pair(E.first, E.second));
G[E.first].erase(make_pair(pos, E.second)); if (G[E.first].size() == 1) Q.push(E.first);
}
for (int i = 1; i <= 2 * N; i++) {
if (colored[i] == false && G[i].size() == 0) {
cout << "NO" << endl;
return 0;
}
}
for (int i = 1; i <= 2 * N; i++) {
auto itr = G[i].begin();
while (itr != G[i].end()) {
X[i].push_back(*itr);
itr++;
}
}
vector<pair<int, int>>Z; Z.push_back(make_pair(V1, V2));
for (int i = 1; i <= 2 * N; i++) {
if (colored[i] == true) continue;
vector<int>E;
if (X[i][0].first == X[i][1].first) {
colored[i] = true; colored[X[i][0].first] = true;
E.push_back(S[X[i][0].second]);
E.push_back(S[X[i][1].second]);
}
else {
int cx = i;
while (true) {
int nex = -1, cost = -1;
for (int j = 0; j < X[cx].size(); j++) {
if (colored[X[cx][j].first] == false) { nex = X[cx][j].first; cost = S[X[cx][j].second]; }
}
if (nex == -1) break;
cx = nex; colored[cx] = true; E.push_back(cost);
}
}
int pa = 0, pb = 0;
for (int j = 0; j < E.size(); j++) { if (j % 2 == 0) pa += E[j]; else pb += E[j]; }
Z.push_back(make_pair(pa - pb, pb - pa));
}
bool FinalAns = solve(N, K, Z);
if (FinalAns == true) cout << "YES" << endl;
else cout << "NO" << endl;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |