#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const ll INF = 0x1fffffffffffffff;
#define overload3(a,b,c,d,...) d
#define all(a) begin(a), end(a)
#define rep1(n) for(int i = 0; i < n; i++)
#define rep2(i,n) for(int i = 0; i < n; i++)
#define rep3(i,a,b) for(int i = a; i < b; i++)
#define rep(...) overload3(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__)
#define each(i,a) for(auto&& i : a)
template<class T, class U> bool chmin(T& a, const U& b){ if(a > b){ a = b; return 1; } return 0; }
template<class T, class U> bool chmax(T& a, const U& b){ if(a < b){ a = b; return 1; } return 0; }
struct SlidMax{
deque<pair<ll, int>> q;
int low = 0, high = 0;
ll pop(){
ll ans = q[0].first;
if(q.front().second == low++) q.pop_front();
return ans;
}
void push(ll x){
while(q.size() && q.back().first <= x) q.pop_back();
q.emplace_back(x, high++);
}
};
ll Diameter(const vector<vector<pii>>& g){
int n = g.size();
vector<ll> cost(n, INF);
vector<bool> used(n);
queue<int> q;
q.push(0);
cost[0] = 0;
while(q.size()){
int at = q.front();
q.pop();
if(used[at]) continue;
used[at] = 1;
each(i, g[at]) if(chmin(cost[i.first], cost[at] + i.second)) q.push(i.first);
}
int d = max_element(all(cost)) - cost.begin();
cost.assign(n, INF);
used.assign(n, 0);
q.push(d);
cost[d] = 0;
while(q.size()){
int at = q.front();
q.pop();
if(used[at]) continue;
used[at] = 1;
each(i, g[at]) if(chmin(cost[i.first], cost[at] + i.second)) q.push(i.first);
}
return *max_element(all(cost));
}
ll solve(const vector<vector<pii>>& g){
int n = g.size();
int at = 0;
vector<bool> circle(n);
rep(n) at = g[at][0].first;
rep(n){
at = g[at][0].first;
circle[at] = 1;
}
vector<ll> d(n);
auto dfs = [&](int from, int at, const auto& f) -> void {
rep(i, 1, g[at].size()){
int to = g[at][i].first;
if(to != from && !circle[to]){
f(at, to, f);
chmax(d[at], d[to] + g[at][i].second);
}
}
};
rep(n) if(circle[i]) dfs(-1, i, dfs);
ll ans = Diameter(g);
int circle_size = accumulate(all(circle), 0);
vector<ll> len(circle_size * 2 + 1);
rep(circle_size * 2){
int to = g[at][0].first;
len[i + 1] = len[i] + g[at][0].second;
at = to;
}
SlidMax mx;
rep(circle_size - 1){
at = g[at][0].first;
mx.push(len[i + 1] + d[at]);
}
at = g[at][0].first;
rep(circle_size){
chmax(ans, mx.pop() - len[i] + d[at]);
mx.push(len[circle_size + i] + d[at]);
at = g[at][0].first;
}
return ans;
}
int main(){
int n;
cin >> n;
vector<vector<pii>> G(n);
rep(n){
int a, b;
cin >> a >> b;
a--;
G[i].emplace_back(a, b);
}
rep(n) G[G[i][0].first].emplace_back(i, G[i][0].second);
vector<int> idx(n, -1);
ll ans = 0;
rep(n) if(idx[i] == -1){
vector<int> vertex;
auto cc = [&](int at, const auto& f) -> void {
idx[at] = vertex.size();
vertex.push_back(at);
each(i, G[at]) if(idx[i.first] == -1) f(i.first, f);
};
cc(i, cc);
int n = vertex.size();
vector<vector<pii>> g(n);
rep(n){
auto& edge = G[vertex[i]][0];
g[i].emplace_back(idx[edge.first], edge.second);
}
rep(n){
auto& edge = G[vertex[i]][0];
g[idx[edge.first]].emplace_back(i, edge.second);
}
ans += solve(g);
}
cout << ans << endl;
}
Compilation message
islands.cpp: In instantiation of 'solve(const std::vector<std::vector<std::pair<int, int> > >&)::<lambda(int, int, const auto:1&)> [with auto:1 = solve(const std::vector<std::vector<std::pair<int, int> > >&)::<lambda(int, int, const auto:1&)>]':
islands.cpp:79:40: required from here
islands.cpp:10:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#define rep3(i,a,b) for(int i = a; i < b; i++)
^
islands.cpp:6:32: note: in expansion of macro 'rep3'
#define overload3(a,b,c,d,...) d
^
islands.cpp:11:18: note: in expansion of macro 'overload3'
#define rep(...) overload3(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__)
^~~~~~~~~
islands.cpp:71:9: note: in expansion of macro 'rep'
rep(i, 1, g[at].size()){
^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
256 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
4 ms |
256 KB |
Output is correct |
5 |
Correct |
5 ms |
384 KB |
Output is correct |
6 |
Correct |
5 ms |
384 KB |
Output is correct |
7 |
Correct |
5 ms |
256 KB |
Output is correct |
8 |
Correct |
4 ms |
384 KB |
Output is correct |
9 |
Correct |
5 ms |
384 KB |
Output is correct |
10 |
Correct |
4 ms |
384 KB |
Output is correct |
11 |
Correct |
5 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
512 KB |
Output is correct |
2 |
Correct |
7 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
512 KB |
Output is correct |
2 |
Correct |
10 ms |
1024 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
25 ms |
1712 KB |
Output is correct |
2 |
Correct |
50 ms |
6516 KB |
Output is correct |
3 |
Correct |
34 ms |
3448 KB |
Output is correct |
4 |
Correct |
18 ms |
1792 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
74 ms |
9084 KB |
Output is correct |
2 |
Correct |
126 ms |
9536 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
280 ms |
31344 KB |
Output is correct |
2 |
Correct |
265 ms |
26564 KB |
Output is correct |
3 |
Correct |
355 ms |
45772 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
504 ms |
30276 KB |
Output is correct |
2 |
Correct |
617 ms |
89324 KB |
Output is correct |
3 |
Correct |
655 ms |
73172 KB |
Output is correct |
4 |
Correct |
882 ms |
124444 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
1180 ms |
131076 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
1174 ms |
131076 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |