# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
218885 | 2020-04-03T02:17:54 Z | peuch | Islands (IOI08_islands) | C++17 | 569 ms | 131076 KB |
#include<bits/stdc++.h> using namespace std; const int MAXN = 1000001; int n; int ar[MAXN], wg[MAXN], in[MAXN], pai[MAXN]; int op[MAXN]; long long prof[MAXN], sc[MAXN], dist[MAXN]; bool marc[MAXN], isCycle[MAXN]; long long ans; vector<int> rev[MAXN], rwg[MAXN]; int dfs1(int cur); long long dfs2(int cur); void getCycle(); int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d %d", &ar[i], &wg[i]); rev[ar[i]].push_back(i); rev[i].push_back(ar[i]); rwg[ar[i]].push_back(wg[i]); rwg[i].push_back(wg[i]); in[ar[i]]++; } getCycle(); printf("%lld\n", ans); } int dfs1(int cur){ marc[cur] = 1; int ret = cur; for(int i = 0; i < rev[cur].size(); i++){ int viz = rev[cur][i]; if(in[viz]) continue; if(marc[viz]) continue; pai[viz] = pai[cur]; dist[viz] = dist[cur] + rwg[cur][i]; int aux = dfs1(viz); if(dist[aux] > dist[ret]) ret = aux; } return ret; } long long dfs2(int cur){ marc[cur] = 0; long long ret = dist[cur]; for(int i = 0; i < rev[cur].size(); i++){ int viz = rev[cur][i]; if(isCycle[viz] && pai[cur] != viz) continue; if(!marc[viz]) continue; dist[viz] = dist[cur] + rwg[cur][i]; ret = max(ret, dfs2(viz)); } return ret; } void getCycle(){ queue<int> fila; for(int i = 1; i <= n; i++) if(in[i] == 0) fila.push(i); while(!fila.empty()){ int cur = fila.front(); fila.pop(); int viz = ar[cur]; in[viz]--; prof[viz] = max(prof[viz], prof[cur] + wg[cur]); if(in[viz] == 0) fila.push(viz); } for(int i = 1; i <= n; i++){ if(in[i] == 0 || isCycle[i]) continue; int cur = i; sc[cur] = 0; long long aux = 0; long long sct = 0; while(1) { isCycle[cur] = 1; pai[cur] = cur; dist[cur] = 0; int x = dfs1(cur); dist[x] = 0; long long y = dfs2(x); aux = max(aux, y); sct += wg[cur]; op[ar[cur]] = cur; if(ar[cur] == i) break; sc[ar[cur]] = sc[cur] + wg[cur]; cur = ar[cur]; } cur = ar[i]; long long aux2 = prof[i] - sc[i]; long long aux3 = prof[i] + sc[i]; while(1){ if(cur == i) break; aux = max(aux, aux2 + prof[cur] + sc[cur]); aux = max(aux, aux3 + sct + prof[cur] - sc[cur]); aux2 = max(aux2, prof[cur] - sc[cur]); aux3 = max(aux3, prof[cur] + sc[cur]); cur = ar[cur]; } cur = op[op[i]]; aux2 = prof[ar[cur]] + sc[ar[cur]]; aux3 = prof[ar[cur]] - sc[ar[cur]]; while(1){ if(cur == op[i]) break; aux = max(aux, aux2 + prof[cur] - sc[cur]); aux = max(aux, aux3 + sct + prof[cur] + sc[cur]); aux2 = max(aux2, prof[cur] + sc[cur]); aux3 = max(aux3, prof[cur] - sc[cur]); cur = op[cur]; } ans += aux; } }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 32 ms | 47352 KB | Output is correct |
2 | Correct | 33 ms | 47360 KB | Output is correct |
3 | Correct | 32 ms | 47360 KB | Output is correct |
4 | Correct | 35 ms | 47480 KB | Output is correct |
5 | Correct | 33 ms | 47360 KB | Output is correct |
6 | Correct | 34 ms | 47360 KB | Output is correct |
7 | Correct | 35 ms | 47360 KB | Output is correct |
8 | Correct | 33 ms | 47360 KB | Output is correct |
9 | Correct | 33 ms | 47360 KB | Output is correct |
10 | Correct | 33 ms | 47360 KB | Output is correct |
11 | Correct | 34 ms | 47360 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 33 ms | 47480 KB | Output is correct |
2 | Correct | 33 ms | 47480 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 34 ms | 47616 KB | Output is correct |
2 | Correct | 35 ms | 47744 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 44 ms | 49020 KB | Output is correct |
2 | Correct | 61 ms | 51192 KB | Output is correct |
3 | Correct | 51 ms | 49656 KB | Output is correct |
4 | Correct | 40 ms | 48504 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 69 ms | 52856 KB | Output is correct |
2 | Correct | 90 ms | 58104 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 195 ms | 69644 KB | Output is correct |
2 | Correct | 158 ms | 70136 KB | Output is correct |
3 | Correct | 189 ms | 74744 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 268 ms | 90616 KB | Output is correct |
2 | Correct | 318 ms | 102264 KB | Output is correct |
3 | Correct | 335 ms | 107000 KB | Output is correct |
4 | Correct | 413 ms | 116728 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 482 ms | 131076 KB | Execution killed with signal 9 (could be triggered by violating memory limits) |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 569 ms | 131076 KB | Execution killed with signal 9 (could be triggered by violating memory limits) |
2 | Halted | 0 ms | 0 KB | - |