제출 #1359096

#제출 시각아이디문제언어결과실행 시간메모리
1359096kanapojpmPilot (NOI19_pilot)C++20
100 / 100
539 ms71384 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
vector<int> p;
vector<int> sz;
int sum=0;
int find_p(int u){
    if(p[u]==u)return u;
    return p[u]=find_p(p[u]);
}
signed main(){
    int n,m;
    cin >> n >> m;
    p.resize(n);
    sz.resize(n);
    for(int i=0;i<n;i++){
        p[i]=i;
        sz[i]=1;
    }
    vector<int> h(n);
    vector<pair<int,int>> lis;
    for(int i=0;i<n;i++){
        cin >> h[i];
        lis.push_back({h[i],i});
    }
    vector<pair<int,int>> pl;
    vector<int> ans(m);
    for(int i=0;i<m;i++){
        int y;
        cin >> y;
        pl.push_back({y,i});
    }
    sort(lis.begin(),lis.end());
    sort(pl.begin(),pl.end());
    int idx=0;
    //for(int i=0;i<pl.size();i++) cout << pl[i].first << " " << pl[i].second << "\n";
    for(int i=0;i<pl.size();i++){
        // for(int j=0;j<n;j++){
        //     cout << sz[find_p()]
        // }
        int val = pl[i].first;
        while(idx<lis.size()&&lis[idx].first<=val){
            int idx2 = lis[idx].second;
            int s=1;
            if(idx2-1>=0&&h[idx2-1]<=lis[idx].first){
                int p1 = find_p(idx2-1);
                int p2 = find_p(idx2);                
                if(p1!=p2){                
                    //cout << "-" << sz[p1] << " ";
                    sum-=(sz[p1]*(sz[p1]-1)/2) + sz[p1];
                    s+=sz[p1];
                    if(sz[p1]>sz[p2]){
                        p[p2]=p1;
                        sz[p1]+=sz[p2];
                    }
                    else{
                        p[p1]=p2;
                        sz[p2]+=sz[p1];
                    }
                }
            }
            if(idx2+1<n&&h[idx2+1]<lis[idx].first){
                int p1 = find_p(idx2+1);
                int p2 = find_p(idx2);
                if(p1!=p2){
                    //cout << "-" << sz[p1] << " ";
                    sum-=(sz[p1]*(sz[p1]-1)/2) + sz[p1];
                    s+=sz[p1];
                    if(sz[p1]>sz[p2]){
                        p[p2]=p1;
                        sz[p1]+=sz[p2];
                    }
                    else{
                        p[p1]=p2;
                        sz[p2]+=sz[p1];
                    }
                }
            }
            sum+=(s*(s-1)/2) + s;
            //cout << s << " " << sum << "\n";
            idx++;
        }
        //cout << "\n";
        //cout << sum;
        ans[pl[i].second] = sum;
    }
    for(int i=0;i<ans.size();i++)
        cout << ans[i] << " ";
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…