#pragma GCC target ("avx2")
#pragma GCC optimize ("O3")
#include <iostream>
#include <vector>
#include <set>
#include <queue>
using namespace std;
const int dydis = 1e6 + 100;
const long long inf = 1000000000000000000;
int n;
int ind;
long long opcija, pries, pgl, delta;
vector<pair<int, int> > grafas[dydis];
int gr[dydis] = {0};
int wh[dydis] = {0};
bool vis[dydis] = {0};
bool visited[dydis] = {0};
bool inCycle[dydis] = {0};
long long cycVal[dydis] = {0};
long long pref[dydis], suf[dydis];
multiset<long long> pirmas, antras;
void dfs(int v, int prim) {
queue<int> q;
q.push(v);
while (!q.empty()) {
v = q.front();
q.pop();
if (visited[v]) {
continue;
}
visited[v] = 1;
for (auto x : grafas[v]) {
if (visited[x.first]) {
continue;
}
q.push(x.first);
}
}
}
vector<int> cNodes, cNodes1;
bool fd = 0;
void findCycle(int v) {
if (fd) {
return;
}
if (vis[v]) {
cNodes.push_back(v);
fd = 1;
return;
}
if (!fd) {
cNodes.push_back(v);
}
vis[v] = 1;
findCycle(gr[v]);
if (!fd) {
cNodes.pop_back();
}
}
long long otherVal = 0;
long long dfs1(int v, int came) {
long long ret = 0;
long long mx1 = 0;
long long mx2 = 0;
long long opcija;
for (auto x : grafas[v]) {
if (x.first == came) {
continue;
}
opcija = dfs1(x.first, v) + x.second;
if (opcija > mx1) {
mx2 = mx1;
mx1 = opcija;
}
else if (opcija > mx2) {
mx2 = opcija;
}
ret = max(ret, opcija);
}
otherVal = max(otherVal, mx1 + mx2);
return ret;
}
void removeVal(multiset<long long> &st, long long val) {
auto itr = st.find(val);
if (itr != st.end()) {
st.erase(itr);
}
}
bool yraKairej[dydis] = {0};
long long sm1, sm2, st, atsak, mx1, mx2, sum, m, did1, did2;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
a--;
gr[i] = a;
wh[i] = b;
grafas[a].push_back({i, b});
grafas[i].push_back({a, b});
}
atsak = 0;
for (int i = 0; i < n; i++) {
if (visited[i]) {
continue;
}
dfs(i, i);
cNodes1.clear();
cNodes.clear();
fd = 0;
findCycle(i);
bool can = 0;
for (auto x : cNodes) {
if (x == cNodes.back()) {
can = 1;
}
if (can) {
cNodes1.push_back(x);
}
}
cNodes1.pop_back();
for (auto x : cNodes1) {
inCycle[x] = 1;
}
otherVal = 0;
for (auto x : cNodes1) {
cycVal[x] = 0;
mx1 = 0, mx2 = 0;
for (auto y : grafas[x])
if (!inCycle[y.first]) {
opcija = dfs1(y.first, x) + y.second;
cycVal[x] = max(cycVal[x], opcija);
if (opcija > mx1) {
mx2 = mx1;
mx1 = opcija;
}
else if (opcija > mx2) {
mx2 = opcija;
}
otherVal = max(otherVal, mx1 + mx2);
}
}/*
cout << i << " cycle = ";
for(auto x : cNodes1){
cout << "{" << x << ", " << cycVal[x] << "} ";
}
cout << endl << endl;*/
sum = 0;
for (auto x : cNodes1) {
sum += wh[x];
}
m = cNodes1.size();
st = 0;
pref[0] = 0;
suf[m - 1] = 0;
for (int j = 1; j < m; j++) {
pref[j] = pref[j - 1] + wh[cNodes1[j - 1]];
}
for (int j = m - 2; j > -1; j--) {
suf[j] = suf[j + 1] + wh[cNodes1[j]];
}
// ats1 = mas[i] + mas[j] + pref[j] - pref[i]
// ats1 = (mas[i] - pref[i]) + (mas[j]+pref[j])
//
// ats2 = (pref[i] + mas[i] + x) + suf[j] + mas[j]
for (int j = 0; j < m; j++) {
pirmas.insert(cycVal[cNodes1[j]] + pref[j]);
antras.insert(cycVal[cNodes1[j]] + suf[j]);
}
for (int j = 0; j < m - 1; j++) {
removeVal(pirmas, cycVal[cNodes1[j]] + pref[j]);
removeVal(antras, cycVal[cNodes1[j]] + suf[j]);
did1 = (*pirmas.rbegin()) + cycVal[cNodes1[j]] - pref[j];
did2 = (*antras.rbegin()) + pref[j] + wh[cNodes1[m - 1]] + cycVal[cNodes1[j]];
st = max(st, max(did1, did2));
}
removeVal(pirmas, cycVal[cNodes1[m - 1]] + pref[m - 1]);
removeVal(antras, cycVal[cNodes1[m - 1]] + suf[m - 1]);
st = max(st, otherVal);
atsak += st;
// cout << "DONE" << endl << endl << endl;
}
cout << atsak;
return 0;
}
/*
* 1) kai pridedu nauja node'a, jo reiksme bus atstumas iki pirmosios (pagal laikr. ) + cycVal[x]
* 2) kai pasalinu nauja node'a, jo reiksme bus
*
*/
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
16 ms |
23756 KB |
Output is correct |
2 |
Correct |
18 ms |
23880 KB |
Output is correct |
3 |
Correct |
17 ms |
23884 KB |
Output is correct |
4 |
Correct |
16 ms |
23860 KB |
Output is correct |
5 |
Correct |
19 ms |
23860 KB |
Output is correct |
6 |
Correct |
16 ms |
23856 KB |
Output is correct |
7 |
Correct |
18 ms |
23812 KB |
Output is correct |
8 |
Correct |
16 ms |
23756 KB |
Output is correct |
9 |
Correct |
16 ms |
23756 KB |
Output is correct |
10 |
Correct |
16 ms |
23864 KB |
Output is correct |
11 |
Correct |
16 ms |
23872 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
17 ms |
23928 KB |
Output is correct |
2 |
Correct |
18 ms |
23928 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
17 ms |
23884 KB |
Output is correct |
2 |
Correct |
19 ms |
24340 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
25 ms |
24968 KB |
Output is correct |
2 |
Correct |
41 ms |
27964 KB |
Output is correct |
3 |
Correct |
26 ms |
24984 KB |
Output is correct |
4 |
Correct |
21 ms |
24436 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
61 ms |
29424 KB |
Output is correct |
2 |
Correct |
86 ms |
31852 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
105 ms |
37572 KB |
Output is correct |
2 |
Correct |
176 ms |
45100 KB |
Output is correct |
3 |
Correct |
217 ms |
58548 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
209 ms |
47564 KB |
Output is correct |
2 |
Correct |
312 ms |
79800 KB |
Output is correct |
3 |
Correct |
537 ms |
89064 KB |
Output is correct |
4 |
Correct |
547 ms |
113316 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
344 ms |
75904 KB |
Output is correct |
2 |
Runtime error |
757 ms |
131076 KB |
Execution killed with signal 9 |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
429 ms |
121040 KB |
Output is correct |
2 |
Correct |
425 ms |
90248 KB |
Output is correct |
3 |
Runtime error |
456 ms |
131076 KB |
Execution killed with signal 9 |
4 |
Halted |
0 ms |
0 KB |
- |