結果
| 問題 | No.3537 Thank You! |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-09 01:28:51 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 276 ms / 2,000 ms |
| コード長 | 2,543 bytes |
| 記録 | |
| コンパイル時間 | 4,460 ms |
| コンパイル使用メモリ | 383,948 KB |
| 実行使用メモリ | 18,488 KB |
| 最終ジャッジ日時 | 2026-05-09 01:29:02 |
| 合計ジャッジ時間 | 7,772 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| サブタスク1 | 30 % | AC * 21 |
| サブタスク2 | 70 % | AC * 15 |
| 合計 | 2.5 * 100% = 250 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using i128 = __int128;
using pll = pair<ll, ll>;
using vll = vector<ll>;
template <class T>
using max_heap = priority_queue<T>;
template <class T>
using min_heap = priority_queue<T, vector<T>, greater<>>;
constexpr ll INF = (1LL << 60);
ll ALPHABET_N = 26;
#define rep(i, n) for (ll i = (ll)0; i < (ll)n; i++)
#define rep_(i, k, n) for (ll i = (ll)k; i < (ll)n; i++)
#define rrep(i, n) for (ll i = (ll)(n) - 1; i >= 0; i--)
#define all(a) a.begin(), a.end()
#define sum_(a) accumulate(a.begin(), a.end(), 0LL)
template <class T>
bool chmax(T &a, const T &b)
{
if (a < b)
{
a = b;
return true;
}
return false;
}
template <class T>
bool chmin(T &a, const T &b)
{
if (a > b)
{
a = b;
return true;
}
return false;
}
#include <atcoder/all>
using namespace atcoder;
using mint = modint998244353;
struct S
{
long long value;
int size;
};
using F = long long;
const F ID = 8e18;
S op(S a, S b) { return {a.value + b.value, a.size + b.size}; }
S e() { return {0, 0}; }
S mapping(F f, S x)
{
if (f != ID)
x.value = f * x.size;
return x;
}
F composition(F f, F g) { return (f == ID ? g : f); }
F id() { return ID; }
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n, b;
cin >> n >> b;
ll ans = 0;
vll C(n), S_(n);
rep(i, n) cin >> C[i];
rep(i, n) cin >> S_[i];
vector<pll> CS;
rep(i, n) CS.emplace_back(C[i], S_[i]);
sort(all(CS));
atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> segcs(n), segs(n);
ll idx = 0;
for (auto [c, s] : CS)
{
segcs.set(idx, {c * s, 1});
segs.set(idx, {s, 1});
idx++;
}
rep(i, n)
{
auto [c, s] = CS[i];
ll cnt = min({b, s});
ll restb = b - cnt;
segcs.set(i, {0, 1});
segs.set(i, {0, 1});
ll l = 0, r = n + 1;
while ((r - l) > 1)
{
ll mid = (l + r) / 2;
ll ssum = segcs.prod(0, mid).value;
if (ssum < restb)
{
l = mid;
}
else
{
r = mid;
}
}
ll ret = cnt + segs.prod(0, l).value;
ll restb_ = restb - segcs.prod(0, l).value;
if (l < C.size())
ret += restb_ / CS[l].first;
chmax(ans, ret);
segcs.set(i, {c * s, 1});
segs.set(i, {s, 1});
}
cout << ans << endl;
return 0;
}