제출 #72124

#제출 시각아이디문제언어결과실행 시간메모리
72124IDxTree (#118)박스런 (FXCUP3_box)C++17
100 / 100
159 ms11564 KiB
#include <bits/stdc++.h> #define va first #define vb second using namespace std; typedef pair<int,int> pii; const int mx = 5e5 + 5, ms = 1.05e6; struct Segtree{ int n, seg[ms], *a; int _i(int now, int s, int e){ //printf("_i(%d %d %d)\n",now,s,e); if(s == e){ //printf("seg[%d] = %d\n",now,a[s]); return seg[now] = a[s]; } int m = (s+e)/2; seg[now] = max(_i(now<<1,s,m), _i(now<<1|1,m+1,e)); //printf("seg[%d] = %d\n",now,seg[now]); return seg[now]; } Segtree(){} Segtree(int n, int *a):n(n),a(a){ //printf("n = %d, a = %p\n",n,a); _i(1,1,n); } int midx(int now, int s, int e, int l, int r, int v){ //printf("midx(%d,%d,%d,%d,%d,%d)\n",now,s,e,l,r,v); if(e < l || s > r) return INT_MAX; if(seg[now] < v) return INT_MAX; if(l <= s && e <= r){ if(s == e){ //printf("end game. seg[%d] = %d, v = %d\n",now,seg[now],v); return seg[now] >= v ? s : INT_MAX; } int lf = now << 1, rg = lf | 1, m = (s+e)/2; if(seg[lf] >= v) return midx(lf,s,m,l,r,v); else return midx(rg,m+1,e,l,r,v); } int m = (s+e)/2; int lv = midx(now<<1,s,m,l,r,v); if(lv != INT_MAX) return lv; else return midx(now<<1|1,m+1,e,l,r,v); } }; stack<pii> stk; int n; int h[mx], stop[mx]; void input(){ cin >> n; for(int i = 1; i <= n; i++) cin >> h[i]; h[0] = INT_MAX; stk.emplace(h[0],0); for(int i = 1; i <= n; i++){ while(!stk.empty() && stk.top().va < h[i]) stk.pop(); stop[i] = i - stk.top().vb - 1; //printf("stop[%d] = %d\n",i,stop[i]); stk.emplace(h[i],i); } assert(!stk.empty()); } void pro(){ Segtree S(n,stop); for(int i = 1; i < n; i++){ int m = S.midx(1,1,n,i+1,n,i); cout << (m == INT_MAX ? -1 : m-i) << ' '; } cout << -1 << '\n'; } int main(){ ios::sync_with_stdio(0);cin.tie(0); input(); pro(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...