結果

問題 No.3537 Thank You!
コンテスト
ユーザー V_Melville
提出日時 2026-05-08 22:16:17
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 25 ms / 2,000 ms
コード長 1,583 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,507 ms
コンパイル使用メモリ 340,264 KB
実行使用メモリ 6,400 KB
最終ジャッジ日時 2026-05-08 22:16:26
合計ジャッジ時間 4,095 ms
ジャッジサーバーID
(参考情報)
judge1_1 / judge3_0
このコードへのチャレンジ
(要ログイン)
サブタスク 配点 結果
サブタスク1 30 % AC * 21
サブタスク2 70 % AC * 15
合計 2.5 * 100% = 250 点
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;
using P = pair<int, int>;

int main() {
    cin.tie(nullptr) -> sync_with_stdio(false);
    
    int n, b;
    cin >> n >> b;
    
    vector<P> ps(n);
    rep(i, n) cin >> ps[i].first;
    rep(i, n) cin >> ps[i].second;
    sort(ps.begin(), ps.end());
    
    vector<ll> cost(n+1);
    vector<ll> cnt(n+1);
    rep(i, n) {
        cost[i+1] = cost[i] + (ll)ps[i].first*ps[i].second;
        cnt[i+1] = cnt[i] + ps[i].second;
    }

    ll ans = 0;
    rep(i, n) {
        ll now = 0;
        if (ps[i].second >= b) now = b;
        else {
            ll r = b-ps[i].second;
            int ac = 0, wa = n+1;
            while (abs(ac-wa) > 1) {
                int wj = (ac+wa)/2;
                
                auto ok = [&]{
                    ll w = cost[wj];
                    if (wj > i) w -= (ll)ps[i].first*ps[i].second;
                    return w <= r;
                }();
                
                (ok ? ac : wa) = wj;
            }
            
            ll co = cost[ac];
            if (ac > i) co -= (ll)ps[i].first*ps[i].second;
            ll num = cnt[ac];
            if (ac > i) num -= ps[i].second;
            now = ps[i].second + num;
            int ni = ac;
            if (ni == i) ++ni;
            if (ni < n) {
                ll cand = (r-co)/ps[ni].first;
                now += min<ll>(ps[ni].second, cand);
            }
        }
        ans = max(ans, now);
    }
    
    cout << ans << '\n';
    
    return 0;
}
0