結果
| 問題 |
No.1365 [Cherry 1st Tune] Whose Fault?
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-01-22 22:54:47 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,257 ms / 2,000 ms |
| コード長 | 5,232 bytes |
| コンパイル時間 | 2,975 ms |
| コンパイル使用メモリ | 207,204 KB |
| 最終ジャッジ日時 | 2025-01-18 05:23:26 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 46 |
ソースコード
//@formatter:off
#include<bits/stdc++.h>
#define overload4(_1,_2,_3,_4,name,...) name
#define rep1(i,n) for (ll i = 0; i < ll(n); ++i)
#define rep2(i,s,n) for (ll i = ll(s); i < ll(n); ++i)
#define rep3(i,s,n,d) for(ll i = ll(s); i < ll(n); i+=d)
#define rep(...) overload4(__VA_ARGS__,rep3,rep2,rep1)(__VA_ARGS__)
#define rrep(i,n) for (ll i = ll(n)-1; i >= 0; i--)
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
#define pb push_back
#define eb emplace_back
#ifdef __LOCAL
#define debug(...) { cout << #__VA_ARGS__; cout << ": "; print(__VA_ARGS__); cout << flush; }
#else
#define debug(...) void(0)
#endif
#define INT(...) int __VA_ARGS__;scan(__VA_ARGS__)
#define LL(...) ll __VA_ARGS__;scan(__VA_ARGS__)
#define STR(...) string __VA_ARGS__;scan(__VA_ARGS__)
#define CHR(...) char __VA_ARGS__;scan(__VA_ARGS__)
#define DBL(...) double __VA_ARGS__;scan(__VA_ARGS__)
#define LD(...) ld __VA_ARGS__;scan(__VA_ARGS__)
using namespace std;
using ll = long long;
using ld = long double;
using P = pair<int,int>;
using LP = pair<ll,ll>;
using vi = vector<int>;
using vvi = vector<vector<int>>;
using vl = vector<ll>;
using vvl = vector<vector<ll>>;
using vd = vector<double>;
using vvd = vector<vector<double>>;
using vs = vector<string>;
using vc = vector<char>;
using vvc = vector<vector<char>>;
using vb = vector<bool>;
using vvb = vector<vector<bool>>;
using vp = vector<P>;
using vvp = vector<vector<P>>;
template<class S,class T> istream& operator>>(istream &is,pair<S,T> &p) { return is >> p.first >> p.second; }
template<class S,class T> ostream& operator<<(ostream &os,const pair<S,T> &p) { return os<<'{'<<p.first<<","<<p.second<<'}'; }
template<class T> istream& operator>>(istream &is,vector<T> &v) { for(T &t:v){is>>t;} return is; }
template<class T> ostream& operator<<(ostream &os,const vector<T> &v) { os<<'[';rep(i,v.size())os<<v[i]<<(i==int(v.size()-1)?"":","); return os<<']'; }
template<class T> bool chmin(T& a,T b) {if(a > b){a = b; return true;} return false;}
template<class T> bool chmax(T& a,T b) {if(a < b){a = b; return true;} return false;}
void scan(){}
template <class Head, class... Tail> void scan(Head& head, Tail&... tail){ cin >> head; scan(tail...); }
template<class T> void print(const T& t){ cout << t << '\n'; }
template <class Head, class... Tail> void print(const Head& head, const Tail&... tail){ cout<<head<<' '; print(tail...); }
template<class T> void fin(T a) { print(a); exit(0); }
const string yes[] = {"no","yes"};
const string Yes[] = {"No","Yes"};
const string YES[] = {"NO","YES"};
const int inf = 1001001001;
const ll linf = 1001001001001001001;
//@formatter:on
class unionfind {
int n;
vector<int> par, rank;
vi sa, sb;
vvi ps;
public:
unionfind(int n) : n(n), par(n, -1), rank(n, 0), sa(n), sb(n), ps(n) {}
void set(int i, int a, int b, int p) {
sa[i] = a, sb[i] = b;
ps[i].assign(101, 0);
ps[i][p]++;
}
int root(int x) {
if (par[x] < 0) return x;
else return par[x] = root(par[x]);
}
bool same(int x, int y) { return root(x) == root(y); };
bool merge(int x, int y) {
x = root(x);
y = root(y);
if (x == y) return false;
if (rank[x] < rank[y]) swap(x, y);
if (rank[x] == rank[y]) rank[x]++;
par[x] += par[y];
par[y] = x;
sa[x] += sa[y];
sb[x] += sb[y];
rep(i, 101) ps[x][i] += ps[y][i];
return true;
}
int size(int x) { return -par[root(x)]; };
bool connected() {
rep(i, n - 1) if (!same(i, i + 1)) return false;
return true;
}
P get(int x) {
x = root(x);
return {sa[x], sb[x]};
}
vi getP(int x) { return ps[root(x)]; }
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
INT(n);
vi a(n), b(n), p(n);
cin >> a >> b >> p;
INT(q);
unionfind uf(n);
vd as(n);
double ans = 0;
cout << fixed << setprecision(15);
rep(i, n) {
uf.set(i, a[i], b[i], p[i]);
as[i] = (a[i] - b[i]) * (a[i] - b[i]) * p[i];
ans += as[i];
}
rep(i, q) {
INT(x, y);
x--;
y--;
if (uf.same(x, y)) {
print(ans);
continue;
}
ans -= as[uf.root(x)];
ans -= as[uf.root(y)];
uf.merge(x, y);
auto[na, nb] = uf.get(x);
vi np = uf.getP(x);
int d = abs(na - nb);
if (d == 0 or np[0] > 0) {
as[uf.root(x)] = 0;
print(ans);
continue;
}
double ok = 1e12, ng = 0;
auto f = [&](double x) -> bool {
double now = 0;
rep(j, 1, 101) {
double l = x / j / 2;
now += l * np[j];
}
return now >= d;
};
assert(f(ok));
rep(_, 80) {
double mid = (ng + ok) / 2;
if (f(mid)) ok = mid;
else ng = mid;
}
double now = 0;
rep(j, 1, 101) {
double l = ok / j / 2;
now += l * l * j * np[j];
}
as[uf.root(x)] = now;
ans += now;
print(ans);
}
}