제출 #1310775

#제출 시각아이디문제언어결과실행 시간메모리
1310775aryanSnowball (JOI21_ho_t2)C++20
0 / 100
231 ms1108 KiB
#include<bits/stdc++.h>
using namespace std;

using i64 = long long;


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

    int n,q;
    cin >> n >> q;
    vector<i64> a(n);
    for(int i = 0;i < n;i++){
        cin >> a[i];
    }

    vector<i64> dist(n - 1);
    for(int i = 0;i < n - 1;i++){
        dist[i] = a[i + 1] - a[i];
    }

    // |...|...|...|
    vector<pair<i64,int>> que;
    i64 cur = 0;
    for(int i = 0;i < q;i++){
        i64 w;
        cin >> w;
        cur += w;
        que.push_back({cur,i});
    }
    sort(que.begin(),que.end());

    vector<i64> we(n);
    for(int i = 0;i < n;i++){

        // right
        {
            function<bool(i64,i64)> f = [&](i64 x,i64 d){
                bool ok = false;
                int mini = q;
                for(int i = 0;i < q;i++){
                    if(x <= que[i].first){
                        mini = min(mini,que[i].second);
                        ok = true;
                    }
                }
                if(!ok) return false;
                for(int i = 0;i < q;i++){
                    if(que[i].first < 0 && x + -1*que[i].first > d && que[i].second < mini){
                        return false;
                    }
                }
                return true;
            };
            i64 d = ((i != n - 1) ? dist[i] : LLONG_MAX);
            i64 s = 0;
            i64 e = d;
            while(e > s){
                i64 mid = (s + e + 1) / 2;
                if(f(mid,d)){
                    s = mid;
                }else{
                    e = mid - 1;
                }
            }
            we[i] = e;
        }

        // left
         {
            function<bool(i64,i64)> f = [&](i64 x,i64 d){
                bool ok = false;
                int mini = q;
                for(int i = 0;i < q;i++){
                    if(que[i].first < 0 && x <= -1*que[i].first){
                        mini = min(mini,que[i].second);
                        ok = true;
                    }
                }
                if(!ok) return false;
                for(int i = 0;i < q;i++){
                    if(que[i].first > 0 && x + que[i].first > d && que[i].second < mini){
                        return false;
                    }
                }
                return true;
            };
            i64 d = ((i != 0) ? dist[i - 1] : LLONG_MAX);
            i64 s = 0;
            i64 e = d;
            while(e > s){
                i64 mid = (s + e + 1) / 2;
                if(f(mid,d)){
                    s = mid;
                }else{
                    e = mid - 1;
                }
            }
            we[i] += e;
        }
    }
    for(int i = 0;i < n;i++){
            cout << we[i] << '\n';
        }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...