Submission #684174

# Submission time Handle Problem Language Result Execution time Memory
684174 2023-01-20T15:15:18 Z starplat Islands (IOI08_islands) C++14
67 / 100
758 ms 131076 KB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,u,w,vis[1000005],no[1000005],is[1000005];
int pt,done,cycle[1000005],bck[1000005],mx,ans;
int node,dist,dp[1000005],par[2000005],we[2000005];
vector<pair<int,int>> g[1000005];
void dfs(int x,int p){
	if (done) return;
	if (vis[x]){
		int cnt=0;
		for (auto i:g[x]) cnt+=i.first==p;
		if (cnt==2){
			cycle[++pt]=x;
			cycle[++pt]=p;
			is[x]=true; is[p]=true;
		}
		else {
			while (p!=x){
				is[p]=true;
				cycle[++pt]=p;
				p=bck[p];
				if (p==-1) break;
			}
			is[x]=true; cycle[++pt]=x;
		}
		done=true;
	}
	else {
		vis[x]=1; bck[x]=p;
		for (auto i:g[x]){
			if (i.first!=p) dfs(i.first,x);
		} 
	}
}
void mem(int x){
	no[x]=1;
	for (auto i:g[x]){
		if (!no[i.first]) mem(i.first);
	}
}
void dfs1(int x,int p,int d){
	if (d>dist) {
		node=x; dist=d;
	}
	for (auto i:g[x]) {
		if (i.first!=p && !is[i.first]) dfs1(i.first,x,d+i.second);
	}
}
void treedp(int x,int p){
	for (auto i:g[x]){
		if (is[i.first] || i.first==p) continue;
		treedp(i.first,x);
	}
	for (auto i:g[x]){
		if (is[i.first] || i.first==p) continue;
		dp[x]=max(dp[x],dp[i.first]+i.second);
	}
}
int weight(int x,int tar){
	for (auto i:g[x]) if (i.first==tar) return i.second;
	return 0;
}
void work(){
	int sum=0;
	priority_queue<pair<int,int>> q;
	for (int i=2;i<=pt;i++) we[i]=we[i+pt]=weight(cycle[i-1],cycle[i]);
	we[pt+1]=weight(cycle[pt],cycle[1]); 
	for (int i=1;i<=2*pt;i++) par[i]=par[i-1]+we[i];
	for (int i=2;i<=pt;i++) q.push({par[i]+dp[cycle[i]],i});
	for (int i=1;i<=pt;i++){
		while (!q.empty() && q.top().second<=i) q.pop();
		if (!q.empty()) mx=max(mx,q.top().first+dp[cycle[i]]-sum);
	//	cout<<i<<" "<<q.top().first+dp[cycle[i]]-sum<<"\n";
		sum+=we[i+1]; q.push({par[pt+i]-par[i+1]+dp[cycle[i]]+sum,pt+i});
	}
}
signed main(){
	cin>>n;
	for (int i=1;i<=n;i++){
		cin>>u>>w;
		g[i].push_back({u,w});
		g[u].push_back({i,w});
		bck[i]=-1;
	}
	for (int i=1;i<=n;i++){
		if (no[i]) continue;
		node=mx=dist=done=pt=0;
		dfs(i,-1); mem(i);
		if (done){
			for (int j=1;j<=pt;j++){
				treedp(cycle[j],-1);
				for (auto k:g[cycle[j]]){
					if (is[k.first]) continue;
					node=dist=0;
					dfs1(k.first,-1,0);
					dfs1(node,-1,0);
					mx=max(mx,dist);
				}
			}
			if (pt==2){
				int tmp=0;
				for (auto j:g[cycle[1]]){
					if (j.first==cycle[2]) tmp=max(tmp,j.second);
 				}
 				mx=max(mx,dp[cycle[1]]+dp[cycle[2]]+tmp);
			}
			else {
				work();
				reverse(cycle+1,cycle+1+pt);
				work();
			}
		}
		else {
			dfs1(i,-1,0);
			dfs1(node,-1,0);
			mx=max(mx,dist);
		}
	//	cout<<mx<<"\n";
		ans+=mx;
	}
	cout<<ans<<"\n";
}
# Verdict Execution time Memory Grader output
1 Correct 16 ms 23772 KB Output is correct
2 Correct 14 ms 23820 KB Output is correct
3 Correct 16 ms 23860 KB Output is correct
4 Correct 14 ms 23764 KB Output is correct
5 Correct 15 ms 23788 KB Output is correct
6 Correct 16 ms 23740 KB Output is correct
7 Correct 15 ms 23812 KB Output is correct
8 Correct 18 ms 23888 KB Output is correct
9 Correct 18 ms 23832 KB Output is correct
10 Incorrect 14 ms 23764 KB Output isn't correct
11 Correct 14 ms 23812 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 24004 KB Output is correct
2 Correct 17 ms 23948 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 18 ms 24036 KB Output is correct
2 Correct 20 ms 24488 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 38 ms 25584 KB Output is correct
2 Correct 53 ms 29376 KB Output is correct
3 Correct 44 ms 25812 KB Output is correct
4 Correct 26 ms 24712 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 73 ms 31784 KB Output is correct
2 Correct 111 ms 34664 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 201 ms 45072 KB Output is correct
2 Correct 227 ms 56644 KB Output is correct
3 Correct 289 ms 76456 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 349 ms 60760 KB Output is correct
2 Correct 434 ms 106860 KB Output is correct
3 Correct 520 ms 114616 KB Output is correct
4 Runtime error 618 ms 131076 KB Execution killed with signal 9
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 723 ms 94292 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 758 ms 131072 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -