Submission
Status:
PPPPPPP---
Score: 70
User: Nagorn
Problemset: สมดุลย์
Language: cpp
Time: 0.002 second
Submitted On: 2025-03-05 13:16:14
#include <bits/stdc++.h>
#define int long long
#define pii pair <int,int>
#define tiii tuple <int, int, int>
#define f first
#define s second
#define all(x) x.begin(), x.end()
#define iShowSpeed cin.tie(NULL)->sync_with_stdio(false)
using namespace std;
const int mod = 1e9 + 7;
const int inf = 1e18;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int32_t main(){
iShowSpeed;
int n;
cin >> n;
vector <pii> adj(n + 1);
vector <double> weight(n + 1);
vector <pii> link(n + 1);
vector <pair <bool, bool>> single(n + 1);
for (int i = 1; i <= n; i++) {
int a, l, b, r;
cin >> a >> l >> b >> r;
if (!a) {
adj[i].f = l;
link[l] = {i, 0};
}
else {
single[i].f = true;
adj[i].f = l;
}
if (!b) {
adj[i].s = r;
link[r] = {i, 1};
}
else {
adj[i].s = r;
single[i].s = true;
}
}
// for (int i = 1; i <= n; i++) {
// cout << i << ": \n";
// cout << "connect: " << adj[i].f << ' ' << adj[i].s << "\n";
// cout << "single or not: " << (single[i].f && single[i].s) << '\n';
// cout << "link: " << link[i].f << ' ' << link[i].s << '\n';
// }
double sum = 0;
int rou = 1;
vector <bool> visited(n + 1);
while (1) {
// cout << "Round " << rou << ": \n";
for (int i = 1; i <= n; i++) {
if (single[i].f && single[i].s && !visited[i]) {
visited[i] = true;
// cout << i << ": ";
if (adj[i].f != adj[i].s) {
double dif = abs(adj[i].f - adj[i].s);
// cout << dif;
sum += dif;
}
auto [u, di] = link[i];
if (di) {
adj[u].s = max(adj[i].f, adj[i].s) * 2;
single[u].s = true;
}
else {
adj[u].f = max(adj[i].f, adj[i].s) * 2;
single[u].f = true;
}
// cout << "\n";
if (i == 1) {
cout << sum;
return 0;
}
}
}
rou++;
}
// cout << sum;
}