Submission #396610

#TimeUsernameProblemLanguageResultExecution timeMemory
396610peuchIslands (IOI08_islands)C++17
60 / 100
65 ms30488 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN = 100001; int n; int ar[MAXN], wg[MAXN], in[MAXN], rep; int op[MAXN]; long long prof[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; 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] && rep != viz) continue; if(!marc[viz]) continue; dist[viz] = dist[cur] + rwg[cur][i]; ret = max(ret, dfs2(viz)); } 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; dist[cur] = 0; long long aux = 0; long long sct = 0; while(1) { isCycle[cur] = 1; rep = cur; long long auxDist = dist[cur]; dist[cur] = 0; int x = dfs1(cur); dist[x] = 0; long long y = dfs2(x); aux = max(aux, y); dist[cur] = auxDist; sct += wg[cur]; op[ar[cur]] = cur; if(ar[cur] == i) break; dist[ar[cur]] = dist[cur] + wg[cur]; cur = ar[cur]; } cur = ar[i]; long long aux2 = prof[i] - dist[i]; long long aux3 = prof[i] + dist[i]; while(1){ if(cur == i) break; aux = max(aux, aux2 + prof[cur] + dist[cur]); aux = max(aux, aux3 + sct + prof[cur] - dist[cur]); aux2 = max(aux2, prof[cur] - dist[cur]); aux3 = max(aux3, prof[cur] + dist[cur]); cur = ar[cur]; } cur = op[op[i]]; aux2 = prof[ar[cur]] + dist[ar[cur]]; aux3 = prof[ar[cur]] - dist[ar[cur]]; while(1){ if(cur == op[i]) break; aux = max(aux, aux2 + prof[cur] - dist[cur]); aux = max(aux, aux3 + sct + prof[cur] + dist[cur]); aux2 = max(aux2, prof[cur] + dist[cur]); aux3 = max(aux3, prof[cur] - dist[cur]); cur = op[cur]; } ans += aux; } }

Compilation message (stderr)

islands.cpp: In function 'int dfs1(int)':
islands.cpp:36:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |  for(int i = 0; i < rev[cur].size(); i++){
      |                 ~~^~~~~~~~~~~~~~~~~
islands.cpp: In function 'long long int dfs2(int)':
islands.cpp:50:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |  for(int i = 0; i < rev[cur].size(); i++){
      |                 ~~^~~~~~~~~~~~~~~~~
islands.cpp: In function 'int main()':
islands.cpp:20:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   20 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
islands.cpp:22:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   22 |   scanf("%d %d", &ar[i], &wg[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...