結果
| 問題 |
No.2523 Trick Flower
|
| コンテスト | |
| ユーザー |
ei1333333
|
| 提出日時 | 2023-10-27 22:08:33 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,057 bytes |
| コンパイル時間 | 4,696 ms |
| コンパイル使用メモリ | 259,316 KB |
| 最終ジャッジ日時 | 2025-02-17 15:07:25 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 WA * 19 |
ソースコード
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using int64 = long long;
constexpr int mod = 998244353;
constexpr int64 infll = (1LL << 62) - 1;
constexpr int inf = (1 << 30) - 1;
struct IoSetup {
IoSetup() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cout << fixed << setprecision(10);
cerr << fixed << setprecision(10);
}
} iosetup;
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
os << p.first << " " << p.second;
return os;
}
template<typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
is >> p.first >> p.second;
return is;
}
template<typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
for (int i = 0; i < (int) v.size(); i++) {
os << v[i] << (i + 1 != v.size() ? " " : "");
}
return os;
}
template<typename T>
istream &operator>>(istream &is, vector<T> &v) {
for (T &in : v) is >> in;
return is;
}
template<typename T1, typename T2>
inline bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); }
template<typename T1, typename T2>
inline bool chmin(T1 &a, T2 b) { return a > b && (a = b, true); }
template<typename T = int64>
vector<T> make_v(size_t a) {
return vector<T>(a);
}
template<typename T, typename... Ts>
auto make_v(size_t a, Ts... ts) {
return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}
template<typename T, typename V>
typename enable_if<is_class<T>::value == 0>::type fill_v(T &t, const V &v) {
t = v;
}
template<typename T, typename V>
typename enable_if<is_class<T>::value != 0>::type fill_v(T &t, const V &v) {
for (auto &e : t) fill_v(e, v);
}
template<typename F>
struct FixPoint : F {
explicit FixPoint(F &&f) : F(forward<F>(f)) {}
template<typename... Args>
decltype(auto) operator()(Args &&... args) const {
return F::operator()(*this, forward<Args>(args)...);
}
};
template<typename F>
inline decltype(auto) MFP(F &&f) {
return FixPoint<F>{forward<F>(f)};
}
int main() {
int N;
cin >> N;
vector< int > A(N), B(N), C(N);
cin >> A >> B >> C;
for(auto& c : C) --c;
int64 ok = 0, ng = infll;
atcoder::dsu uf(N);
vector< int > deg(N);
for(int i = 0; i < N; i++) {
deg[C[i]]++;
uf.merge(i, C[i]);
}
queue< int > que;
for(int i = 0; i < N; i++) {
if(deg[i] == 0) {
que.emplace(i);
}
}
vector< vector< int > > g(N);
while(not que.empty()) {
auto i = que.front();
que.pop();
--deg[C[i]];
g[C[i]].emplace_back(i);
if(deg[C[i]] == 0) {
que.emplace(C[i]);
}
}
vector< vector< int > > group(N);
vector< int64 > need(N), sum(N);
for(int i = 0; i < N; i++) {
if(deg[i] > 0) {
int now = i;
do {
deg[now] = 0;
group[uf.leader(i)].emplace_back(now);
sum[uf.leader(i)] += A[now];
need[uf.leader(i)] += B[now];
} while (now != i);
}
}
auto check = [&](int64 x) {
for(int i = 0; i < N; i++) {
if(group[i].empty()) {
continue;
}
if((__int128_t)need[i] * x > infll) {
return false;
}
__int128_t rest = sum[i] - need[i] * x;
if(rest < 0) {
return false;
}
for(auto& p : group[i]) {
bool f = true;
auto dfs = MFP([&](auto dfs, int idx) -> pair< int64, int64 > {
int64 need = 0;
if(p != idx) {
need -= A[idx];
need += (__int128_t) B[idx] * x;
if(need > infll) {
f = false;
return {0, 0};
}
}
int64 tap = 0;
for(auto& to : g[idx]) {
auto res = dfs(to);
need += res.first;
chmax(tap, res.second);
}
chmax(tap, need);
return {need, tap};
});
rest -= dfs(p).second;
if(rest < 0 or not f) {
return false;
}
}
}
return true;
};
while(ng - ok > 1) {
auto mid = (ok + ng) / 2;
if(check(mid)) ok = mid;
else ng = mid;
}
cout << ok << endl;
}
ei1333333