# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
142646 | 2019-08-10T08:51:45 Z | RafaelSus | Transport (COCI19_transport) | C++14 | 1000 ms | 18544 KB |
#include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; const int maxn = 1e5 + 5; int n, a[maxn], w[maxn]; vector <pair<int, long long>> g[maxn]; int used[maxn]; long long dp1[maxn], ben1[maxn]; long long dp2[maxn], ben2[maxn]; int sz[maxn]; long long answ; void sizeCounter(int v, int p){ sz[v] = 1; dp1[v] = dp2[v] = 0; ben1[v] = ben2[v] = 0; for (int i = 0; i < g[v].size(); i++){ int to = g[v][i].first; if (to == p || used[to]) continue; sizeCounter(to, v); sz[v] += sz[to]; } } int center = 0; void findCen(int v, int p, int cnt){ int ok = 1; for (int i = 0; i < g[v].size(); i++){ int to = g[v][i].first; if (to == p || used[to]) continue; if (sz[to] - 1 >= cnt){ ok = 1; findCen(to, v, cnt); break; } } if (ok == 0) center = v; } vector <long long> G; void push_DP(int v, int p){ sz[v] = 1; for (int i = 0; i < g[v].size(); i++){ int to = g[v][i].first; int len = g[v][i].second; if (to == p || used[to]) continue; ben1[to] = ben1[v] + a[v] - len; dp1[to] = dp1[v]; if (ben1[to] < 0){ dp1[to] -= ben1[to]; ben1[to] = 0; } int d = a[to] - len; dp2[to] = dp2[v] + d; ben2[to] = min(1ll * d, ben2[v] + d); push_DP(to, v); sz[v] += sz[to]; } if (ben2[v] >= 0){ G.push_back(dp2[v]); } } int findCenter(int v){ sizeCounter(v, -1); center = v; findCen(v, -1, (sz[v] - 1) / 2); push_DP(center, -1); return center; } vector <long long> P; vector <int> ver; void solve(int v, int p){ if (p != -1){ ver.push_back(v); if (ben2[v] >= 0){ P.push_back(dp2[v]); } } int idx = lower_bound(G.begin(), G.end(), dp1[v]) - G.begin(); answ += (int)G.size() - idx; if (p == -1) answ--; for (int i = 0; i < g[v].size(); i++){ int to = g[v][i].first; if (to == p || used[to]) continue; solve (to, v); if (p == -1){ sort (P.begin(), P.end()); for (int j = 0; j < ver.size(); j++){ int u = ver[j]; int id = lower_bound(P.begin(), P.end(), dp1[u]) - P.begin(); answ -= (int)P.size() - id; } P.clear(); ver.clear(); } } } void centroidDecomposition() { queue <int> q; q.push(1); while (!q.empty()) { int v = q.front(); q.pop(); v = findCenter(v); sort(G.begin(), G.end()); solve(v, -1); G.clear(); for (int i = 0; i < g[v].size(); i++){ int to = g[v][i].first; if (used[to] || sz[to] == 1) continue; q.push(to); } used[v] = 1; } } int main() { ios::sync_with_stdio(false); cin.tie(0); scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 0; i < n - 1; i++) { int x, y, z; scanf("%d%d%d", &x, &y, &z); g[x].push_back({ y, z }); g[y].push_back({ x, z }); } centroidDecomposition(); printf("%lld\n", answ); return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 24 ms | 3068 KB | Output is correct |
2 | Correct | 10 ms | 3192 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 808 ms | 3904 KB | Output is correct |
2 | Correct | 796 ms | 3960 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Execution timed out | 1063 ms | 11532 KB | Time limit exceeded |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Execution timed out | 1045 ms | 14364 KB | Time limit exceeded |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Execution timed out | 1018 ms | 18544 KB | Time limit exceeded |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Execution timed out | 1004 ms | 6228 KB | Time limit exceeded |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 107 ms | 7796 KB | Output is correct |
2 | Execution timed out | 1068 ms | 7440 KB | Time limit exceeded |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 343 ms | 9356 KB | Output is correct |
2 | Correct | 295 ms | 9500 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 529 ms | 11356 KB | Output is correct |
2 | Correct | 371 ms | 11132 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Execution timed out | 1038 ms | 13880 KB | Time limit exceeded |
2 | Halted | 0 ms | 0 KB | - |