Submission #1331831

#TimeUsernameProblemLanguageResultExecution timeMemory
1331831nathan4690Tricks of the Trade (CEOI23_trade)C++20
100 / 100
932 ms32852 KiB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define f1(i,n) for(int i=1;i<=n;i++)
#define __file_name ""
using namespace std;
const ll maxn=1e6+5, inf=1e18;
const int LG = 18;

struct FenwickTree{
    int n;
    vector<ll> bit;
    void init(int n_){
        n = n_;
        bit.resize(n + 1, 0);
    }
    void update(int idx, ll v){
        for(;idx<=n;idx+=idx&-idx) bit[idx] += v;
    }
    ll getSum(int idx){
        ll s = 0;
        for(;idx>0;idx-=idx&-idx) s += bit[idx];
        return s;
    }
    int walk(ll v){
        ll s = 0, pos = 0;
        int lg = __lg(n);
        for(int i = lg; i >= 0; i--){
            if(pos + (1 << i) < n && s + bit[pos + (1 << i)] < v){
                pos += (1 << i);
                s += bit[pos];
            }
        }
        return pos + 1;
    }
};

int n, k, c[maxn], s[maxn], poss[maxn], optp[maxn];
FenwickTree st, ft;
int L = 1, R = 0;
ll dp[maxn], pf[maxn];
int ST[LG][maxn];

void add(int i){
    int pos = poss[i];
    ft.update(pos, 1);
    st.update(pos, s[i]);
}

void del(int i){
    int pos = poss[i];
    ft.update(pos, -1);
    st.update(pos, -s[i]);
}

ll getVal(int l, int r){
    if(r - l + 1 < k) return -2*inf;
    while(l < L) add(--L);
    while(R < r) add(++R);
    while(l > L) del(L++);
    while(R > r) del(R--);
    int idx = ft.walk(k);
    return st.getSum(idx) - pf[r] + pf[l - 1];
}

void solve(int l, int r, int optl, int optr){
    if(l > r) return;
    int idx = (l + r) / 2;
    ll valdp = -inf;
    int opt = 1;
    for(int i = optl; i <= optr && i <= idx; i++){
        ll vdp = getVal(i, idx);
        if(vdp >= valdp){
            valdp = vdp;
            opt = i;
        }
    }
    dp[idx] = valdp;
    optp[idx] = opt;
    solve(l, idx - 1, optl, opt);
    solve(idx + 1, r, opt, optr);
}

void updMin(int l, int r, int x){
    int b = __lg(r - l + 1);
    ST[b][l] = min(ST[b][l], x);
    ST[b][r - (1 << b) + 1] = min(ST[b][r - (1 << b) + 1], x);
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    if(fopen(__file_name ".inp", "r")){
        freopen(__file_name ".inp", "r", stdin);
        freopen(__file_name ".out", "w", stdout);
    }
    cin >> n >> k;
    f1(i,n) {
        cin >> c[i];
        pf[i] = pf[i-1] + c[i];
    }
    vector<pair<int,int>> vs;
    f1(i,n) {
        cin >> s[i];
        vs.push_back({s[i], i});
    }
    sort(vs.begin(), vs.end(), greater<pair<int,int>>());
    vs.insert(vs.begin(), {0, 0});
    f1(i,n){
        poss[vs[i].second] = i;
    }
    st.init(n); ft.init(n);
    solve(1, n, 1, n);
    for(int b = 0; b < LG; b++) f1(i,n) ST[b][i] = 1e9+7;
    optp[0] = 1;
    ll ans = *max_element(dp+1,dp+n+1);
    int j = 1;
    f1(i,n){
        if(dp[i] != ans) continue;
        for(; j <= optp[i]; j++){
            ll x = getVal(j, i);
            if(x == ans){
                int idx = ft.walk(k);
                updMin(j, i, vs[idx].first);
            }
        }
        j--;
    }
    for(int b = LG - 1; b > 0; b--){
        f1(i,n){
            ST[b-1][i] = min(ST[b-1][i], ST[b][i]);
            int j = i + (1 << (b - 1));
            ST[b-1][j] = min(ST[b-1][j], ST[b][i]);
        }
    }
    cout << ans << '\n';
    f1(i,n) cout << "01"[ST[0][i] <= s[i]];
    return 0;
}

Compilation message (stderr)

trade.cpp: In function 'int main()':
trade.cpp:94:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |         freopen(__file_name ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
trade.cpp:95:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   95 |         freopen(__file_name ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...