#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define For(i, a, b) for(int i=a; i<b; i++)
#define ffi For(i, 0, N)
#define ffj For(j, 0, M)
#define ffa ffi ffj
#define s <<" "<<
#define c <<" : "<<
#define w cout
#define e endl//"\n"
#define pb push_back
#define mp make_pair
#define a first
#define b second
//#define int ll
const int MAXN=1000000;
///500,000,000
int N, comp[MAXN], cat, nonn[MAXN], st[MAXN], nd[MAXN], v[MAXN];
ll siz[MAXN], out;
vector<ll> pre1, pre2, ans;
bool vis[MAXN], cyc[MAXN];
queue<int> next1;
vector<pair<int, int> > adj[MAXN]; /// (node, cost)
void go(int at) {
if (comp[at] != -1) return;
comp[at] = cat;
for (auto i: adj[at]) go(i.a);
}
void calc_size(int at) {
if (vis[at]) return;
vis[at] = true;
if (adj[at].size() == 1) return;
ll b1 = 0, b2 = 0;
for (auto i: adj[at]) if (!cyc[i.a] && !vis[i.a]) {
calc_size(i.a);
siz[at] = max(siz[at], i.b+siz[i.a]);
if (siz[i.a]+i.b >= b1) {b2 = b1; b1 = i.b+siz[i.a];}
else if (siz[i.a]+i.b > b2) {b2 = i.b+siz[i.a];}
}
//w<< at+1 c b1 s b2<<e;
ans[comp[at]] = max(ans[comp[at]], b1+b2);
}
ll solve (int x) {
ll ret = 0;
int loc = 0; int at = st[x];
//w<< "comp" s x <<e;
while (at != st[x] || loc == 0) {
//w<< at+1<<e;
v[loc] = at;
vis[at] = true;
bool found = false;
for (auto i: adj[at]) if (!vis[i.a]) {
nd[loc] = i.b;
at = i.a;
found = true;
break;
}
if (!found) {
vis[st[x]] = false;
for (auto i: adj[at]) if (!vis[i.a]) {
nd[loc] = i.b;
at = i.a;
}
}
loc++;
}
if (loc == 1) {while (true){}} /// basically an assert
For (i, 0, loc) pre1.pb(0);
//For (i, 0, loc) w<< ns[i] s nd[i]<<e;
pre1[0] = siz[v[0]];
ll curr = 0;
For (i, 1, loc) {
curr += nd[i-1];
pre1[i] = max(pre1[i-1], curr+siz[v[i]]);
ret = max(ret, curr+siz[v[0]] + siz[v[i]]);
}
//For (i, 0, loc) w<< "pre1" s i c pre1[i]<<e;
ll y = nd[loc-1] + siz[v[loc-1]];
curr = nd[loc-1];
for (int i=loc-2; i>=0; i--) {
curr += nd[i];
ret = max(ret, pre1[i] + y);
y = max(y, curr+siz[v[i]]);
}
//For (i, 0, loc) w<< "suf1" s i c suf1[i]<<e;
//w<< "from pass 1, ret =" s ret<<e;
pre1.clear();
For (i, 0, loc) pre2.pb(0);
pre2[0] = siz[v[0]];
For (i, 1, loc) pre2[i] = max(pre2[i-1]+nd[i-1], siz[v[i]]);
//For (i, 0, loc) w<< "pre2" s i c pre2[i]<<e;
ret = max(ret, pre2[loc-1]);
y = 0;
for (int i=loc-2; i>=0; i--) {
y = max(y+nd[i], siz[v[i+1]]+nd[i]);
ret = max(ret, pre2[i]+y);
}
//For (i, 0, loc) w<< "suf2" s i c suf2[i]<<e;
//w<< "after pass 2, ret =" s ret<<e;
pre2.clear();
return max(ret, ans[x]);
}
main() {
//ifstream cin("test.in");
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> N;
ffi {cyc[i] = true; comp[i] = -1; int b, d; cin >> b >> d; b--; adj[i].pb(mp(b, d)); adj[b].pb(mp(i, d));}
ffi if (comp[i] == -1) {go(i); cat++;}
For (i, 0, cat) ans.pb(0);
ffi if (adj[i].size() == 1) next1.push(i);
while (!next1.empty()) {
int at = next1.front(); next1.pop();
if (!cyc[at]) continue;
if (nonn[at] == adj[at].size()-1) {
cyc[at] = false;
for (auto i: adj[at]) {
nonn[i.a]++;
if (cyc[i.a]) next1.push(i.a);
}
}
}
//ffi w<< i+1 c cyc[i]<<e;
ffi if (cyc[i]) {st[comp[i]] = i; calc_size(i);}
//ffi w<< i+1 c siz[i]<<e;
ffi {
vis[i] = false;
if (!cyc[i]) vis[i] = true;
}
For (i, 0, cat) out += solve(i);
w<< out <<e;
}
Compilation message
islands.cpp:107:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
main() {
^
islands.cpp: In function 'int main()':
islands.cpp:118:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if (nonn[at] == adj[at].size()-1) {
~~~~~~~~~^~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
22 ms |
23800 KB |
Output is correct |
2 |
Correct |
24 ms |
24056 KB |
Output is correct |
3 |
Correct |
23 ms |
24056 KB |
Output is correct |
4 |
Correct |
24 ms |
24056 KB |
Output is correct |
5 |
Correct |
22 ms |
24056 KB |
Output is correct |
6 |
Correct |
22 ms |
24180 KB |
Output is correct |
7 |
Correct |
22 ms |
24180 KB |
Output is correct |
8 |
Correct |
22 ms |
24180 KB |
Output is correct |
9 |
Correct |
22 ms |
24180 KB |
Output is correct |
10 |
Correct |
23 ms |
24180 KB |
Output is correct |
11 |
Correct |
21 ms |
24180 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
35 ms |
24180 KB |
Output is correct |
2 |
Correct |
22 ms |
24180 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
25 ms |
24180 KB |
Output is correct |
2 |
Correct |
24 ms |
24388 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
33 ms |
25032 KB |
Output is correct |
2 |
Correct |
47 ms |
27032 KB |
Output is correct |
3 |
Correct |
36 ms |
27032 KB |
Output is correct |
4 |
Correct |
29 ms |
27032 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
61 ms |
28224 KB |
Output is correct |
2 |
Correct |
71 ms |
30404 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
133 ms |
36492 KB |
Output is correct |
2 |
Correct |
131 ms |
38780 KB |
Output is correct |
3 |
Correct |
173 ms |
48296 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
227 ms |
48296 KB |
Output is correct |
2 |
Correct |
281 ms |
65316 KB |
Output is correct |
3 |
Correct |
311 ms |
65316 KB |
Output is correct |
4 |
Correct |
391 ms |
95160 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
415 ms |
95160 KB |
Output is correct |
2 |
Runtime error |
1134 ms |
132096 KB |
Memory limit exceeded: We have a known bug that the memory usage is measured incorrectly (possibly because of Meltdown/Spectre patch), so your solution may be correct. Please submit again. Sorry for the inconvenience. |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
541 ms |
132096 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |