# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
219149 | peuch | Islands (IOI08_islands) | C++17 | 573 ms | 131076 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 dfs(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 dfs(int cur){
marc[cur] = 1;
int ret = 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;
pai[viz] = pai[cur];
dist[viz] = dist[cur] + rwg[cur][i];
int aux = dfs(viz);
if(dist[aux] > dist[ret]) ret = aux;
}
return ret;
}
void getCycle(){
int fila[n];
int ini = 0;
int fim = 0;
for(int i = 1; i <= n; i++)
if(in[i] == 0) fila[fim++] = i;
while(ini != fim){
int cur = fila[ini++];
int viz = ar[cur];
in[viz]--;
prof[viz] = max(prof[viz], prof[cur] + wg[cur]);
if(in[viz] == 0) fila[fim++] = 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 = dfs(cur);
dist[x] = 0;
aux = max(aux, dist[dfs(x)]);
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 (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... |
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |