제출 #1313241

#제출 시각아이디문제언어결과실행 시간메모리
1313241namhhPilot (NOI19_pilot)C++20
100 / 100
400 ms69676 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fi first #define se second const int N = 1e6+5; int n,q,ans[N],par[N],sz[N],check[N],res = 0; pii qr[N],h[N]; void init(){ for(int i = 1; i <= n; i++) par[i] = i; } int find(int u){ if(u == par[u]) return u; return par[u] = find(par[u]); } void join(int u, int v){ u = find(u); v = find(v); res -= sz[u]*(sz[u]+1)/2; res -= sz[v]*(sz[v]+1)/2; sz[u] += sz[v]; par[v] = u; res += sz[u]*(sz[u]+1)/2; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> q; for(int i = 1; i <= n; i++){ cin >> h[i].fi; h[i].se = i; } for(int i = 1; i <= q; i++){ cin >> qr[i].fi; qr[i].se = i; } sort(h+1,h+n+1); sort(qr+1,qr+q+1); init(); int cur = 1; for(int i = 1; i <= q; i++){ while(cur <= n && h[cur].fi <= qr[i].fi){ sz[h[cur].se] = 1; res++; if(h[cur].se > 1 && check[h[cur].se-1]) join(h[cur].se,h[cur].se-1); if(h[cur].se < n && check[h[cur].se+1]) join(h[cur].se,h[cur].se+1); check[h[cur].se] = 1; cur++; } ans[qr[i].se] = res; } for(int i = 1; i <= q; i++) cout << ans[i] << "\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...