Submission #1356833

#TimeUsernameProblemLanguageResultExecution timeMemory
1356833nathlol2Snowball (JOI21_ho_t2)C++20
100 / 100
691 ms9896 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5, INF = 4e18;
int n, m, a[N], w[N], pfn[N], pfx[N], ans[N];

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> m;
    for(int i = 1;i<=n;i++) cin >> a[i];
    for(int i = 1;i<=m;i++) cin >> w[i], w[i] += w[i - 1], pfn[i] = min(pfn[i - 1], w[i]), pfx[i] = max(pfx[i - 1], w[i]);
    ans[1] -= pfn[m];
    ans[n] += pfx[m];
    for(int i = 1;i<=n - 1;i++){
        if(min(a[i + 1], a[i] + pfx[m]) <= max(a[i], a[i + 1] + pfn[m])){
            ans[i] += min(a[i + 1] - a[i], pfx[m]);
            ans[i + 1] -= max(a[i] - a[i + 1], pfn[m]);
            continue;
        }
        int l = a[i], r = a[i + 1], res = a[i];
        while(l <= r){
            int md = l + (r - l) / 2;
            int lb = 0, rb = m, tl = INF, tr = INF;
            while(lb <= rb){
                int mb = (lb + rb) / 2;
                if(pfx[mb] >= md - a[i]){
                    tl = mb;
                    rb = mb - 1;
                }else{
                    lb = mb + 1;
                }
            }
            lb = 0, rb = m;
            while(lb <= rb){
                int mb = (lb + rb) / 2;
                if(pfn[mb] <= md - a[i + 1] - 1){
                    tr = mb;
                    rb = mb - 1;
                }else{
                    lb = mb + 1;
                }
            }
            if(tl < tr){
                res = md;
                l = md + 1;
            }else{
                r = md - 1;
            }
        }
        ans[i] += res - a[i];
        ans[i + 1] += a[i + 1] - res;
    }
    for(int i = 1;i<=n;i++) cout << ans[i] << '\n';
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...