Submission #400295

#TimeUsernameProblemLanguageResultExecution timeMemory
400295ly20Islands (IOI08_islands)C++17
90 / 100
1351 ms131076 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10;
const long long INF = 1123456789012345678;
vector <int> inv[MAXN], invp[MAXN];
int grafo[MAXN], p[MAXN];
int grau[MAXN];
long long tot;
long long resp;
long long rs;
long long mx, id;
int lm;
void dfs3(int v, int pai, long long d) {
	//printf("%d %lld\n", v, d);
	if(d > mx) {
		mx = d; id = v;
	}
	for(int i = 0; i < inv[v].size(); i++) {
		int viz = inv[v][i], ps = invp[v][i];
		if(viz == pai || (grau[viz] != 0 && viz != lm)) continue;
		dfs3(viz, v, d + ps);
	}
	if(grafo[v] != pai && (grau[grafo[v]] == 0 || grafo[v] == lm)) {
		dfs3(grafo[v], v, d + p[v]);
	}
}
void dfs(int v) {
	grau[v]++;
	tot += p[v];
	if(grau[grafo[v]] == 1) dfs(grafo[v]);
}
long long m1, m2, at;
void dfs2(int v) {
	lm = v;
	grau[v]++;
	mx = 0; id = v;
	dfs3(id, id, 0);
	rs = max(rs, max(m1 + at + mx, m2 - at + mx + tot));
	m1 = max(m1, mx - at);
	m2 = max(m2, mx + at);
	at += p[v];
	//printf("oi\n");
	dfs3(id, id, 0);
	//printf("%d %lld\n", v, mx);
	rs = max(rs, mx);
	if(grau[grafo[v]] == 2) dfs2(grafo[v]);
}
int main() {
	int n;
	scanf("%d", &n);
	//printf("%d\n", n);
	for(int i = 1; i <= n; i++) {
		scanf("%d %d", &grafo[i], &p[i]);
		inv[grafo[i]].push_back(i); invp[grafo[i]].push_back(p[i]);
		grau[grafo[i]]++;
	}
	//printf("oi\n");
	queue <int> fila;
	for(int i = 1; i <= n; i++) {
		if(grau[i] == 0) {
			fila.push(i);
		}
	}
	//printf("oi\n");
	while(!fila.empty()) {
		int cur = fila.front(); fila.pop();
		grau[grafo[cur]]--;
		if(grau[grafo[cur]] == 0) fila.push(grafo[cur]);
	}
	//printf("oi\n");
	for(int i = 1; i <= n; i++) {
		if(grau[i] == 1) {
			tot = 0;
			rs = 0;
			at = 0;
			m1 = -INF; m2 = -INF;
			dfs(i);
			//printf("oi\n");
			dfs2(i);
			resp += rs;
			//printf("oi\n");
		}
	}
	//printf("oi\n");
	printf("%lld\n", resp);
}

Compilation message (stderr)

islands.cpp: In function 'void dfs3(int, int, long long int)':
islands.cpp:18:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |  for(int i = 0; i < inv[v].size(); i++) {
      |                 ~~^~~~~~~~~~~~~~~
islands.cpp: In function 'int main()':
islands.cpp:50:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   50 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
islands.cpp:53:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   53 |   scanf("%d %d", &grafo[i], &p[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...