제출 #1359181

#제출 시각아이디문제언어결과실행 시간메모리
1359181whatisdpPilot (NOI19_pilot)C++17
40 / 100
1093 ms4068 KiB
#include<bits/stdc++.h>
using namespace std;
 
struct DSU{
    vector<size_t> sz, pa, ans;
    explicit DSU(size_t size_) : sz(size_, 1), pa(size_) {
        iota(pa.begin(), pa.end(), 0);
    }

    size_t find(int n) {return pa[n]==n ? n : pa[n]=find(pa[n]);}
    bool unite_set(int a, int b) {
        a=find(a),b=find(b);
        if (a==b) return false;
        if (sz[a]<sz[b]) swap(a,b);
        pa[b]=a;
        sz[a]+=sz[b];
        return true;
    }
};

void solve() {
    int n,q;
    cin>>n>>q;

    vector<pair<int,int>> H(n);
    vector<int> hn(n);
    for(int i=0;i<n;i++) {
        cin>>H[i].first;
        H[i].second=i;
        hn[i]=H[i].first;
    }
    sort(H.begin(), H.end());
    vector<pair<int,int>> Y(q);
    for(int i=0;i<q;i++) {
        cin>>Y[i].first;
        Y[i].second=i;
    }
    sort(Y.begin(), Y.end());
    
    DSU d(n);

    vector<int> final(q);

    for(int tc=0;tc<q;tc++) {
        int y=Y[tc].first;
        int ans=0;
        for(int j=0;j<n;) {
            if (hn[j]<=y) {
                while(++j<n && hn[j]<=y) d.unite_set(j-1,j);
                int x=d.sz[d.find(j-1)];
                ans+=((x*(x+1))>>1);
            }
            else j++;
        }
        final[Y[tc].second]=ans;
    }
    for(int x:final) cout<<x<<'\n';
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    // int tc;
    // cin>>tc;
    // while(tc--)
    solve();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…