Submission #1102753

# Submission time Handle Problem Language Result Execution time Memory
1102753 2024-10-18T18:58:26 Z _rain_ Islands (IOI08_islands) C++14
70 / 100
360 ms 131072 KB
#include<bits/stdc++.h>
using namespace std;

#define name "main"
typedef long long ll;
typedef pair<int,int> ii;
#define fi first
#define se second

const int N = (int)2e6;
vector<ii> ke[N+2];
int cost[N+2],gi[N+2],en[N+2],l[N+2],vis[N+2],n,cha[N+2],arr[N+2],sz=0,times=0;
ll dep[N+2]={},pre[N+2]={},f[N+2]={};
bool com[N+2];
void add_edge(int u , int v , int w){
	ke[u].push_back({v,w});
	ke[v].push_back({u,w});
}
void search(int u , int p){
	vis[u] = ++times;
	for (auto& x:ke[u]){
		int v=x.fi,w=x.se;
		if (v==p) continue;
		if (!vis[v]) {
			cha[v]=u;
			gi[v]=w;
			search(v,u);
		}
		else{
			if (vis[v]<vis[u]) continue;
			++sz;
			arr[sz]=v;cost[sz]=w;
			for (; v!=u; v=cha[v]){
				++sz;
				arr[sz]=cha[v];
				cost[sz]=gi[v];
			}
		}
	}
	return ;
}
// the component has at most 1 cycle inside ~
ll mx,ans=0;
int pos,root;
void dfs(int u , int p , ll s){
	if (mx < s){
		mx = s;
		pos = u;
	}
	for (auto& x:ke[u]){
		int v=x.fi,w=x.se;
		if ((com[v]&&v!=root)||v==p) continue;
		dfs(v,u,s+w);
	}
	return;
}
void giai(){
	ll addmore = -1;
	for (int i = 1; i <= sz; ++i) com[arr[i]] = true;
	for (int i = 1; i <= sz; ++i){
		mx=pos=root=-1;
		dfs(arr[i],0,0);
		dep[i]=mx;
		root=arr[i];
		dfs(pos,0,0);
		addmore = max(addmore,mx);
		pre[i]=pre[i-1]+cost[i];
	}
	for (int i = sz + 1; i <= sz*2; ++i){
		cost[i] = cost[i-sz];
		dep[i] = dep[i-sz];
		pre[i]=pre[i-1]+cost[i];
	}
	for (int i=1; i<=sz*2; ++i) f[i]=dep[i]-pre[i];
	deque<int> q;
	for (int i = 1; i <= sz*2; ++i){
		while (q.size() && q.front()<i-sz+1) q.pop_front();
		if (q.size()){
			addmore = max(addmore,pre[i]+dep[i]+f[q.front()]);
		}
		while (q.size() && f[q.back()]<=f[i]) q.pop_back();	
		q.push_back(i);
	}
	ans+=addmore;
}

int32_t main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin>>n;
	for (int i=1; i<=n; ++i){
		cin>>en[i]>>l[i];
		add_edge(i,en[i],l[i]);
	}
	for (int i=1; i<=n; ++i){
		if (!vis[i]){
			sz = times = 0;
			search(i,i);
			giai();
		}
	}
	cout<<ans;
	exit(0);
}
# Verdict Execution time Memory Grader output
1 Correct 12 ms 66640 KB Output is correct
2 Correct 10 ms 66640 KB Output is correct
3 Correct 10 ms 66896 KB Output is correct
4 Correct 10 ms 66640 KB Output is correct
5 Correct 10 ms 66640 KB Output is correct
6 Correct 10 ms 66652 KB Output is correct
7 Correct 11 ms 66640 KB Output is correct
8 Correct 10 ms 66640 KB Output is correct
9 Correct 10 ms 66816 KB Output is correct
10 Correct 10 ms 66640 KB Output is correct
11 Correct 10 ms 66652 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 67068 KB Output is correct
2 Correct 11 ms 66796 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 66896 KB Output is correct
2 Correct 12 ms 67152 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 67628 KB Output is correct
2 Correct 21 ms 69712 KB Output is correct
3 Correct 18 ms 67644 KB Output is correct
4 Correct 13 ms 67408 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 73040 KB Output is correct
2 Correct 31 ms 76624 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 58 ms 80632 KB Output is correct
2 Correct 65 ms 90696 KB Output is correct
3 Correct 84 ms 112204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 95 ms 87280 KB Output is correct
2 Correct 131 ms 126892 KB Output is correct
3 Runtime error 127 ms 131072 KB Execution killed with signal 9
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 195 ms 123304 KB Output is correct
2 Runtime error 360 ms 131072 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 238 ms 131072 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -