This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#ifndef TEST
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx2")
#endif
#include <bits/stdc++.h>
#define For(i, a, b) for(int i = a; i <= b; i++)
#define roF(i, a, b) for(int i = a; i >= b; i--)
#define pb push_back
#define mp make_pair
#define sz(a) (int) (a).size()
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
using namespace std;
using vi = vector<int>;
using ll = long long;
using pi = pair<int, int>;
// #define int ll;
mt19937 rng(random_device {}());
int rand(int a){
return rng() % a;
}
const int N = 100005;
const int inf = 0x3f3f3f3f;
namespace fastIO {
template <class T>
inline void read(T &x){
x = 0;
bool fu = 0; char ch = 0;
while(ch > '9' or ch < '0'){
ch = getchar(); if(ch == '-') fu = 1;
}
while(ch <= '9' and ch >= '0'){
x = (x * 10 - 48 + ch), ch = getchar();
}
if(fu) x = -x;
}
inline int read(){
int x = 0;
bool fu = 0; char ch = 0;
while(ch >'9' or ch < '0'){
ch = getchar(); if(ch == '-') fu = 1;
}
while(ch <= '9' and ch >= '0'){
x = (x * 10 - 48 + ch), ch = getchar();
}
return fu ? -x : x;
}
template <class T, class... Args>
inline void read(T& t, Args&... args){
read(t); read(args...);
}
char _n_u_m_[40];
template <class T>
inline void write(T x){
if(!x){ putchar('0'); return; }
T tmp = x > 0 ? x : -x;
if( x < 0 ) putchar('-');
register int cnt = 0;
while(tmp) {
_n_u_m_[ cnt ++ ] = tmp % 10 + '0'; tmp /= 10;
}
while(cnt) putchar(_n_u_m_[ -- cnt ]) ;
}
template <class T>
inline void write(T x , char ch) {
write(x); putchar(ch);
}
}
using namespace fastIO;
#ifdef LOCAL
#define debug(x) cout << #x << " = " << x << "\n";
#else
#define debug(x) ;
#endif
template <class T>
istream& operator >> (istream& in, vector<T> &x){
for (auto &i : x) in >> i;
return in;
}
template <class T>
ostream& operator << (ostream& out, vector<T> x){
out << "[";
For(i, 0, sz(x) - 1){
out << (i ? ", " : "") << x[i];
}
out << "]";
return out;
}
template <class A, class B>
ostream& operator << (ostream& out, pair<A, B> x){
out << "(" << x.fi << ", " << x.se << ")";
return out;
}
struct edge{
ll x, c;
edge(){}
edge(ll x, ll c) : x(x), c(c){}
bool operator < (const edge &e) const{
return c > e.c;
}
};
int n, a[N];
ll sum, c[N];
vector<edge> e[N];
bool vis[N], siv[N], cyc[N];
vi comp;
void fdfs(int x){
if(x < 1 or vis[x]) return;
comp.pb(x); vis[x] = 1;
for(auto &i : e[x]) fdfs(i.x);
fdfs(a[x]);
}
void rmain(){
cin >> n;
For(i, 1, n){
cin >> a[i] >> c[i];
sum += c[i];
e[a[i]].pb(edge(i, c[i]));
e[i].pb(edge(-1, 0));
}
For(i, 1, n) sort(all(e[i]));
For(i, 1, n){
if(vis[i]) continue;
comp.clear(); fdfs(i);
vi cycle;
int z = i;
while(!siv[z]){
siv[z] = 1;
cycle.pb(z);
z = a[z];
}
cycle.erase(cycle.begin(), find(all(cycle), z));
for(auto &c : cycle) cyc[c] = 1;
if(sz(cycle) == n){
cout << "0"; return;
}
ll res = 0, ser = 0;
for(auto &cc : comp) res += e[cc][0].c;
for(auto &x : cycle){
ser = max(ser, res - e[x][0].c + (cyc[e[x][0].x] ? e[x][1].c : e[x][0].c));
}
sum -= ser;
}
cout << sum;
}
signed main(){
#ifdef LOCAL
using namespace chrono;
auto start = high_resolution_clock::now();
#endif
// freopen("cf.inp", "r", stdin);
// freopen("cf.out", "w", stdout);
ios_base::sync_with_stdio(false); cin.tie(nullptr);
int T = 1;
while(T--) rmain();
#ifdef LOCAL
auto end = high_resolution_clock::now();
auto dur = duration_cast <milliseconds> (end - start).count();
cout << "\n[" << dur << "ms]\n";
#endif
return 0;
}
Compilation message (stderr)
telegraph.cpp: In function 'void fastIO::write(T)':
telegraph.cpp:61:16: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
61 | register int cnt = 0;
| ^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |