# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
59215 | gnoor | Islands (IOI08_islands) | C++17 | 1099 ms | 132096 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 <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
struct edge {
int to,wgt;
int id;
};
vector<edge> pth[1000100];
bool visit[1000100];
bool incyc[1000100];
int cyc[2000100];
long long wgt[2000100];
long long dis[2000100];
int cn;
int dfs(int x,int p) {
visit[x]=true;
int ret=0;
bool toret=false;
for (auto i:pth[x]) {
if (i.id==p) continue;
if (visit[i.to]) {
if (toret) continue;
cyc[cn]=x;
wgt[cn]=i.wgt;
incyc[x]=true;
cn++;
ret=i.to;
toret=true;
continue;
}
int res=dfs(i.to,i.id);
if (toret) continue;
if (res) {
cyc[cn]=x;
wgt[cn]=i.wgt;
incyc[x]=true;
cn++;
if (res!=x) ret=res;
else ret=0;
toret=true;
}
}
return ret;
}
long long dmax[1000100];
long long survey(int x,int p) {
long long res=0;
long long mx=0;
long long smx=0;
long long cur;
dmax[x]=0;
for (auto i:pth[x]) {
if (i.id==p) continue;
if (incyc[i.to]) continue;
cur=i.wgt+survey(i.to,i.id);
if (cur>=mx) {
smx=mx;
mx=cur;
} else if (cur>smx) {
smx=cur;
}
res=max(res,i.wgt+cur);
dmax[x]=max(dmax[x],dmax[i.to]);
}
dmax[x]=max(dmax[x],mx+smx);
return res;
}
int main () {
int n;
scanf("%d",&n);
int a,b;
for (int i=1;i<=n;i++) {
scanf("%d%d",&a,&b);
pth[i].push_back(edge{a,b,i});
pth[a].push_back(edge{i,b,i});
}
long long ans=0;
for (int i=1;i<=n;i++) {
if (visit[i]) continue;
cn=1;
dfs(i,0);
cn--;
for (int j=1;j<=cn;j++) {
dis[j]=survey(cyc[j],0);
dis[j+cn]=dis[j];
wgt[j+cn]=wgt[j];
cyc[j+cn]=cyc[j];
}
wgt[0]=0;
for (int j=1;j<=cn*2;j++) {
wgt[j]+=wgt[j-1];
}
deque<int> qq;
qq.push_back(1);
long long cur=0;
for (int j=2;j<=cn*2;j++) {
while (!qq.empty()&&qq.front()<=j-cn) qq.pop_front();
cur=max(cur,wgt[j]+dis[j]+dis[qq.front()]-wgt[qq.front()]);
cur=max(cur,dmax[cyc[j]]);
while (!qq.empty()&&dis[qq.back()]-wgt[qq.back()]<=dis[j]-wgt[j]) qq.pop_back();
qq.push_back(j);
}
ans+=cur;
}
printf("%lld\n",ans);
return 0;
}
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... |