#pragma comment(linker, "/STACK: 2000000")
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef long long ll;
typedef long double ld;
#define INF 2001001001
#define MOD 1000000007
#define f first
#define s second
int N;
ll ans;
int C;
int cycle[1000001],adjDis[1000001];
ll deepest[1000001];
int bad,bad2;
ll maxCur;
map<pair<int,int>,int>mp;
ll pref[1000001],suff[1000001];
pair<pair<int,int>,int> edges[2000005];
int L[1000001],R[1000001];
bool vis[1000001];
int cur;
void findCycle(int node, int par){
//cout<<"findCycle: "<<node<<endl;
vis[node]=1;
for (int i=L[node];i<=R[node];i++){
if (C==0 && vis[edges[i].f.s]==1 && edges[i].f.s!=par){ //found cycle
C=0;
//cout<<"found cycle"<<endl;
cur=node;
while (cur!=edges[i].f.s){
cycle[C]=cur;
adjDis[C]=deepest[cur]; //fromDis
C++;
cur=pref[cur]; //from
}
cycle[C]=edges[i].f.s;
adjDis[C]=edges[i].s;
C++;
}
else if (vis[edges[i].f.s]==0){
pref[edges[i].f.s]=node; //from
deepest[edges[i].f.s]=edges[i].s; //fromDis
findCycle(edges[i].f.s,node);
}
}
}
ll maxDis,maxNode;
queue<pair<pair<int,int>,ll>>q;
void findFarthest(int node0, int par0, ll dis0){
maxDis=-1; maxNode=-1;
q.push({{node0,par0},dis0});
while (!q.empty()){
int node=q.front().f.f;
int par=q.front().f.s;
ll dis=q.front().s;
q.pop();
if (dis>maxDis){
maxDis=dis;
maxNode=node;
}
for (int i=L[node];i<=R[node];i++){
if (edges[i].f.s!=par && edges[i].f.s!=bad && edges[i].f.s!=bad2)
q.push({{edges[i].f.s,node},dis+edges[i].s});
}
}
}
ll findDiameter(int node){
findFarthest(node,node,0);
int newNode=maxNode;
findFarthest(newNode,newNode,0);
return maxDis;
}
int main()
{
scanf("%d",&N);
for (int i=1;i<=N;i++){
L[i]=INF; R[i]=-INF;
int Y,L;
scanf("%d%d",&Y,&L);
int x=i,y=Y;
if (x>y) swap(x,y);
mp[{x,y}]=max(mp[{x,y}],L);
}
int E=0;
for (auto it:mp){
//cout<<"edge: "<<it.first.first<<' '<<it.first.second<<endl;
edges[E++]={{it.f.f,it.f.s},it.s};
edges[E++]={{it.f.s,it.f.f},it.s};
}
mp.clear();
sort(edges,edges+E);
for (int i=0;i<E;i++){
L[edges[i].f.f]=min(L[edges[i].f.f],i);
R[edges[i].f.f]=max(R[edges[i].f.f],i);
}
for (int i=1;i<=N;i++)
if (vis[i]==0){
//cout<<"Component: "<<i<<endl;
C=0;
findCycle(i,i);
/*
cout<<"Cycle: ";
for (int i=0;i<C;i++)
cout<<cycle[i]<<' '<<adjDis[i]<<endl;;
cout<<endl;
*/
if (C==0){
//cout<<"multiEdge: "<<findDiameter(i)<<endl;
ans+=findDiameter(i);
continue;
}
maxCur=0;
for (int i=0;i<C;i++){
pref[i]=0;
suff[i]=0;
int inFront=cycle[(i+1)%C];
int inBack=cycle[(i-1+C)%C];
//adjDis[i]=mp[{min(cycle[i],inFront),max(cycle[i],inFront)}];
bad=inFront;
bad2=inBack;
maxCur=max(maxCur,findDiameter(cycle[i]));
findFarthest(cycle[i],cycle[i],0);
deepest[i]=maxDis;
}
ll temp=0,temp2=0;
for (int i=0;i<C;i++){
if (i>0){
pref[i]=temp+adjDis[i-1];
temp=pref[i];
pref[i]=max(temp2,pref[i]+deepest[i]);
temp2=pref[i];
}
else{
pref[i]=deepest[i];
temp2=pref[i];
}
}
/*
cout<<"deepest: "<<' ';
for (int x:deepest)
cout<<x<<' ';
cout<<endl;
cout<<"adjDis: "<<' ';
for (int x:adjDis)
cout<<x<<' ';
cout<<endl;
cout<<"pref: ";
for (int i=0;i<C;i++)
cout<<pref[i]<<' ';
cout<<endl;
*/
temp=0; temp2=0;
for (int i=C-1;i>=0;i--){
if (i+1<C){
suff[i]=temp+adjDis[i];
temp=suff[i];
suff[i]=max(temp2,suff[i]+deepest[i]);
temp2=suff[i];
}
else{
suff[i]=deepest[i];
temp2=suff[i];
}
}
for (int i=0;i+1<C;i++){
//cout<<i<<": "<<adjDis.back()<<' '<<pref2[i]<<' '<<suff2[i+1]<<endl;
maxCur=max(maxCur,adjDis[C-1]+pref[i]+suff[i+1]);
}
ll sweep=0;
for (int i=0;i<C;i++){
maxCur=max(maxCur,sweep+deepest[i]);
sweep=max(sweep,(ll)deepest[i]);
sweep+=adjDis[i];
}
ans+=maxCur;
//cout<<"maxCur: "<<maxCur<<endl;
}
printf("%lld\n",ans);
}
Compilation message
islands.cpp:1:0: warning: ignoring #pragma comment [-Wunknown-pragmas]
#pragma comment(linker, "/STACK: 2000000")
islands.cpp:3:0: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
#pragma GCC optimization ("O3")
islands.cpp:4:0: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
#pragma GCC optimization ("unroll-loops")
islands.cpp: In function 'int main()':
islands.cpp:90:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&N);
~~~~~^~~~~~~~~
islands.cpp:94:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d",&Y,&L);
~~~~~^~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
5 ms |
384 KB |
Output is correct |
5 |
Correct |
5 ms |
384 KB |
Output is correct |
6 |
Correct |
5 ms |
384 KB |
Output is correct |
7 |
Correct |
5 ms |
384 KB |
Output is correct |
8 |
Correct |
5 ms |
384 KB |
Output is correct |
9 |
Correct |
5 ms |
384 KB |
Output is correct |
10 |
Correct |
5 ms |
384 KB |
Output is correct |
11 |
Correct |
5 ms |
384 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
512 KB |
Output is correct |
2 |
Correct |
5 ms |
512 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
640 KB |
Output is correct |
2 |
Correct |
9 ms |
896 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
19 ms |
2176 KB |
Output is correct |
2 |
Correct |
38 ms |
5112 KB |
Output is correct |
3 |
Correct |
26 ms |
2688 KB |
Output is correct |
4 |
Correct |
14 ms |
1536 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
53 ms |
7032 KB |
Output is correct |
2 |
Correct |
83 ms |
12536 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
162 ms |
23544 KB |
Output is correct |
2 |
Correct |
200 ms |
27720 KB |
Output is correct |
3 |
Correct |
237 ms |
37368 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
320 ms |
39804 KB |
Output is correct |
2 |
Correct |
436 ms |
66680 KB |
Output is correct |
3 |
Correct |
520 ms |
76696 KB |
Output is correct |
4 |
Correct |
631 ms |
92152 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
995 ms |
111064 KB |
Output is correct |
2 |
Runtime error |
1706 ms |
131076 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
851 ms |
131076 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |