#include<bits/stdc++.h>
#define ll long long
#define f first
#define s second
#define pb push_back
#define N 1000002
using namespace std;
ll n,p[N],l[N],fix[N],F[N],ans,pas,k,c[N],mx[N];
vector<ll>v[N];
map<ll,ll>M[N],ra[N];
vector<ll>g,all;
void dfs(ll x){
if(F[x])return;
all.pb(x);
F[x] = 1;
for(int i=0; i<v[x].size(); i++)
dfs(v[x][i]);
}
void findc(ll x,ll par){
if(fix[x]){
g.pb(x);
k = 1;
return;
}
g.pb(x);
fix[x] = 1;
for(int i=0; i<v[x].size(); i++)
if(v[x][i] != par || ra[x][v[x][i]] > 1){
findc(v[x][i] , x);
if(k)return;
}
g.pop_back();
}
void findmx(ll x,ll par){
ll mx1 = 0,mx2 = 0;
for(int i=0; i<v[x].size(); i++){
if(v[x][i] != par && !c[v[x][i]]){
findmx(v[x][i] , x);
mx[x] = max(mx[x] , mx[v[x][i]] + M[x][v[x][i]]);
if(mx[v[x][i]] + M[x][v[x][i]] > mx1){
mx2 = mx1;
mx1 = mx[v[x][i]] + M[x][v[x][i]];
}
else if(mx[v[x][i]] + M[x][v[x][i]] > mx2)
mx2 = mx[v[x][i]] + M[x][v[x][i]];
}
}
ans = max(ans , mx1 + mx2);
}
int main(){
ios::sync_with_stdio(false);
cin >> n;
for(int i=1; i<=n; i++){
cin >> p[i] >> l[i];
M[i][p[i]] = max(M[i][p[i]] , l[i]);
M[p[i]][i] = max(M[p[i]][i] , l[i]);
ra[i][p[i]]++;
ra[p[i]][i]++;
v[p[i]].pb(i);
v[i].pb(p[i]);
}
for(int s=1; s<=n; s++){
if(F[s])continue;
ans = 0;
k = 0;
all.clear();
dfs(s);
g.clear();
findc(s , 0);
vector<int>cyc;
for(int i=0; i<g.size(); i++){
if(g[i] == g[(int)g.size() - 1]){
for(int j=i+1; j<g.size(); j++){
cyc.pb(g[j]);
c[g[j]] = 1;
}
break;
}
}
for(int i=0; i<cyc.size(); i++){
findmx(cyc[i] , 0);
}
ll cur = mx[cyc[0]];
ll pre = 0;
for(int i=1; i<cyc.size(); i++){
pre += M[cyc[i]][cyc[i - 1]];
ans = max(ans , cur + mx[cyc[i]] + pre);
cur = max(cur , mx[cyc[i]] - pre);
}
if(cyc.size() > 1)
reverse(cyc.begin() + 1,cyc.end());
cur = mx[cyc[0]];
pre = 0;
for(int i=1; i<cyc.size(); i++){
pre += M[cyc[i]][cyc[i - 1]];
ans = max(ans , cur + mx[cyc[i]] + pre);
cur = max(cur , mx[cyc[i]] - pre);
}
pas += ans;
}
cout << pas << '\n';
return 0;
}
Compilation message
islands.cpp: In function 'void dfs(long long int)':
islands.cpp:16:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
16 | for(int i=0; i<v[x].size(); i++)
| ~^~~~~~~~~~~~
islands.cpp: In function 'void findc(long long int, long long int)':
islands.cpp:27:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
27 | for(int i=0; i<v[x].size(); i++)
| ~^~~~~~~~~~~~
islands.cpp: In function 'void findmx(long long int, long long int)':
islands.cpp:36:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
36 | for(int i=0; i<v[x].size(); i++){
| ~^~~~~~~~~~~~
islands.cpp: In function 'int main()':
islands.cpp:73:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
73 | for(int i=0; i<g.size(); i++){
| ~^~~~~~~~~
islands.cpp:75:33: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
75 | for(int j=i+1; j<g.size(); j++){
| ~^~~~~~~~~
islands.cpp:82:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
82 | for(int i=0; i<cyc.size(); i++){
| ~^~~~~~~~~~~
islands.cpp:87:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
87 | for(int i=1; i<cyc.size(); i++){
| ~^~~~~~~~~~~
islands.cpp:96:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
96 | for(int i=1; i<cyc.size(); i++){
| ~^~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
79 ms |
117740 KB |
Output isn't correct |
2 |
Correct |
79 ms |
117868 KB |
Output is correct |
3 |
Incorrect |
78 ms |
117996 KB |
Output isn't correct |
4 |
Correct |
79 ms |
117868 KB |
Output is correct |
5 |
Correct |
91 ms |
117868 KB |
Output is correct |
6 |
Incorrect |
85 ms |
117868 KB |
Output isn't correct |
7 |
Incorrect |
79 ms |
117868 KB |
Output isn't correct |
8 |
Incorrect |
80 ms |
117868 KB |
Output isn't correct |
9 |
Incorrect |
78 ms |
117868 KB |
Output isn't correct |
10 |
Correct |
81 ms |
117868 KB |
Output is correct |
11 |
Correct |
84 ms |
117868 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
89 ms |
118152 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
83 ms |
118476 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
115 ms |
123360 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
136 ms |
131076 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
114 ms |
131072 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
105 ms |
131076 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
121 ms |
131076 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
128 ms |
131076 KB |
Execution killed with signal 9 |
2 |
Halted |
0 ms |
0 KB |
- |