Submission #1209378

#TimeUsernameProblemLanguageResultExecution timeMemory
1209378anfiNile (IOI24_nile)C++20
17 / 100
2095 ms2162688 KiB
#include "nile.h"
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
using int64 = long long;
#define pi pair<int64, int64>
#define artefak pair<pi, pi>
const int64 inf = -(1 << 40);
const int64 mxn = (1 << 18);
int64 tree[4*mxn];

void update(int n, int l, int r, int idx, int val){
    if(l == r){
        tree[n] = val;
        return;
    }
    int m = (l+r)/2;
    if(idx <= m){
        update(2*n+1, l, m, idx, val);
    }else update(2*n+2, m+1, r, idx, val);
    tree[n] = max(tree[2*n+1], tree[2*n+2]);
}

int64 query(int n, int lf, int rg, int l, int r){
    if(r < lf || rg < l) return inf;
    if(lf <= l && rg <= r) return tree[n];
    int mid = (lf+rg)/2;
    return max(query(2*n+1, lf, mid, l, r), query(2*n+2, mid+1,rg, l,r));
}

vector<int64> calculate_costs(vector<int> w,vector<int> a, vector<int> b, vector<int> e){
    int n = w.size(), q = e.size();
    if(n == 0){
        return vector<int64>(q, 0);
    }
    int sigma_a = 0;
    vector<artefak> item;
    for(int i = 0;i < n; i++){
        sigma_a += a[i];
        item.push_back({{w[i], a[i]}, {b[i], a[i]-b[i]}});
    }
    bool cek = 1;
    sort(item.begin(), item.end());
    for(auto &lo : item){
        if(lo.fi.se != 2 || lo.se.fi != 1){
            cek = 0;
            break;
        }
    }
    vector<int64> ans;
    if(cek){
        for(int d : e){
            vector<int> dp(n);
            int j = 0;
            for(int i = 1; i <n; i++){
                while(j < i && item[j].fi.fi < item[i].fi.fi-d) j++;
                int ambil = 0;
                if(j <= i-1){
                    ambil = dp[i] = 1+(i-2>=0 ? dp[i-2] : 0);
                }
                dp[i] = max(dp[i-1], ambil);
            }
            int m = dp[n-1];
            ans.push_back(2*n-2*m);
        }
        return ans;
    }

    for(int i = 0; i < q; i++){
        int d = e[i];
        fill(tree, tree+4*n, inf);
        update(0, 0, n-1, 0, item[0].se.se);
        vector<int64> dp(n);
        for(int j = 1; j < n; j++){
            int W = item[j].fi.fi;
            int minw = W-d;
            int l = 0, r = j;
            while(l < r){
                int mid = (l+r)>>1;
                if(item[mid].fi.fi < minw) l = mid+1;
                else r = mid;
            }
            int jnt = l;

            int64 ambil = inf;
            if(jnt <= j-1){
                ambil = item[j].se.se+query(0,0,n-1, jnt, j-1);
            }
            dp[j] = dp[j-1];
            if(ambil >= -1e15) dp[j] = max(dp[j], ambil);
            int64 val = item[j].se.se+dp[j-1];
            update(0,0,n-1,j,val);
        }
        int64 sav = dp[n-1];
        int64 cost = sigma_a-sav;
        ans.push_back(cost);
    }
    return ans;
}

Compilation message (stderr)

nile.cpp:9:23: warning: left shift count >= width of type [-Wshift-count-overflow]
    9 | const int64 inf = -(1 << 40);
      |                     ~~^~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...