답안 #1102837

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1102837 2024-10-19T04:45:29 Z _rain_ Islands (IOI08_islands) C++14
70 / 100
509 ms 131072 KB
#include<bits/stdc++.h>
using namespace std;
 
#define name "main"
typedef long long ll;
typedef pair<int,int> ii;
typedef pair<int,ll> iil;
#define fi first
#define se second
 
const int N = (int)1e6;
vector<ii> ke[N+2];
int cost[N+2],gi[N+2],vis[N+2],n,cha[N+2],arr[N+2],sz=0,times=0;
ll dep[N*2+2]={},pre[N*2+2]={},f[N*2+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;
}
 
int32_t main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
 
	cin>>n;
	for (int i=1; i<=n; ++i){
		int en,l; cin>>en>>l;
		add_edge(i,en,l);
	}
	for (int id=1; id<=n; ++id){
		if (!vis[id]){
			sz = times = 0;
			search(id,id);
			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);
			}
			deque<iil> q;
			ll sum = 0;
			for (int i = 1; i <= sz*2; ++i){
				int x = (i <= sz ? dep[i] : dep[i - sz]);
				sum += (i <= sz ? cost[i] : cost[i - sz]);
				while (q.size() && q.front().fi < i - sz + 1) q.pop_front();
				if (q.size()){
					addmore = max(addmore,sum+x+q.front().se);
				}
				ll c = x - sum;
				while (q.size() && q.back().se <= c) q.pop_back();
				q.push_back({i,c});
			}
			ans+=addmore;
		}
	}
	cout<<ans;
	exit(0);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 37712 KB Output is correct
2 Correct 6 ms 37712 KB Output is correct
3 Correct 6 ms 37824 KB Output is correct
4 Correct 7 ms 37712 KB Output is correct
5 Correct 6 ms 37712 KB Output is correct
6 Correct 6 ms 37712 KB Output is correct
7 Correct 7 ms 37712 KB Output is correct
8 Correct 7 ms 37712 KB Output is correct
9 Correct 6 ms 37792 KB Output is correct
10 Correct 7 ms 37724 KB Output is correct
11 Correct 7 ms 37712 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 37968 KB Output is correct
2 Correct 7 ms 37968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 37968 KB Output is correct
2 Correct 9 ms 38224 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 38736 KB Output is correct
2 Correct 19 ms 40664 KB Output is correct
3 Incorrect 14 ms 38736 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 37968 KB Output is correct
2 Correct 29 ms 39484 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 69 ms 49348 KB Output is correct
2 Correct 69 ms 54344 KB Output is correct
3 Correct 87 ms 65272 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 111 ms 49100 KB Output is correct
2 Correct 151 ms 73036 KB Output is correct
3 Correct 204 ms 86032 KB Output is correct
4 Correct 202 ms 119112 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 183 ms 78760 KB Output is correct
2 Runtime error 509 ms 131072 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 275 ms 131072 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -