제출 #1340861

#제출 시각아이디문제언어결과실행 시간메모리
1340861NipphitchPilot (NOI19_pilot)C++20
100 / 100
957 ms85160 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
using namespace std;
#define ll long long 
const int N=1e6+5;

int n,q;
ll h[N];
ll sum_now,ans[N];
set <int> pos,tmp;
vector <pair <ll,int>> vec;

ll cal(ll x){
    return x*(x+1)/2;
}

bool cmp(pair <ll,int> x,pair <ll,int> y){
    if(x.first!=y.first) return x.first>y.first;
    else return x.second<y.second;
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> q;
    for(int i=1;i<=n;i++){
        cin >> h[i];
        vec.push_back({h[i],i});
    }
    sum_now=cal(n);
    ans[N-1]=sum_now;
    pos.insert(0);
    pos.insert(n+1);
    sort(vec.begin(),vec.end(),cmp);
    vec.push_back({0,-1});
    memset(ans,-1,sizeof(ans));
    int pv=-1;
    for(auto [h_i,idx]:vec){
        if(pv!=h_i) ans[h_i]=sum_now;
        if(idx==-1) continue;
        auto itr=pos.lower_bound(idx);
        auto itl=prev(itr);
        int l=*itl,r=*itr;
        sum_now-=cal(r-l);
        sum_now+=cal(idx-l)+cal(r-idx);
        pos.insert(idx);
        pv=h_i;
    }
    for(int i=1;i<N;i++) if(ans[i]==-1 && ans[i-1]!=-1) ans[i]=max(ans[i],ans[i-1]);
    while(q--){
        int x;
        cin >> x;
        cout << ans[x] << "\n";
    }
}
#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...