제출 #1143884

#제출 시각아이디문제언어결과실행 시간메모리
1143884mattsohPilot (NOI19_pilot)C++20
55 / 100
1097 ms4508 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef long long ll;

const ll maxn = 1e5+10;
pair<ll,ll> h[maxn];
vector<pair<ll,ll>> rgs;
pair<ll,ll> p[maxn];
bool cmpp(pair<ll,ll>t1,pair<ll,ll>t2){
    if (t1.fi!=t2.fi) return t1.fi>t2.fi;
    else return t2.se<t1.se;
}
void rem(ll idx ){
    ll l = 0, r = rgs.size()-1;
    ll m;
    while (true){
        m = (l+r)/2;
        if (rgs[m].fi <= idx && idx < rgs[m].se) break;
        if (rgs[m].fi<idx){
            l = m+1;
        } else r = m-1;
    }
    pair<ll,ll> range = rgs[m];
    if (range.fi == idx){
        rgs[m].fi = idx+1;
    } else if (range.se == idx){
        rgs[m].se = idx-1;
    } else{
        rgs.insert(rgs.begin()+m+1,{idx+1,rgs[m].se});
        rgs[m].se = idx;
    }
    
}
signed main(){
    cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false);
    ll n,q;cin>>n>>q;
    for (ll i = 0;i<n;i++){
        ll hgt;cin>>hgt;
        h[i] = {hgt,i};
    }
    rgs.push_back({0,n});
    sort(h,h+n,cmpp);
    // reverse(h,h+n);
    // for (ll i = 0;i<n;i++){
    //     cout<<h[i].fi<<h[i].se<<endl;
    // }
    ll maxh = n, curr = 0;
    for (ll i = 0;i<q;i++){
        ll pl;cin>>pl;
        p[i] = {pl,i};
    }
    sort(p,p+q,cmpp);
    for (ll i = 0;i<q;i++){
        ll plane = p[i].fi, ord = p[i].se;
        // cout<<"plane height "<<plane<<ord<<endl;
        while (h[curr].fi > plane){
            // cout<<"removing"<<h[curr].fi<<h[curr].se<<endl;
            rem(h[curr].se);
            curr++;
        }
        ll total = 0;
        for (auto range:rgs){
            // cout<<"range"<<range.fi<<' '<<range.se<<endl;
            ll diff = range.se - range.fi;
            total += diff*(diff+1)/2;
        }
        p[i] = {ord, total};

    }
    sort(p,p+q);
    for (ll i = 0;i<q;i++)cout<<p[i].se<<endl;

}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...