結果
問題 | No.3134 二分探索木 |
ユーザー |
|
提出日時 | 2025-05-02 22:26:24 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 214 ms / 2,000 ms |
コード長 | 3,076 bytes |
コンパイル時間 | 2,674 ms |
コンパイル使用メモリ | 210,148 KB |
実行使用メモリ | 25,600 KB |
最終ジャッジ日時 | 2025-05-02 22:26:31 |
合計ジャッジ時間 | 6,044 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 15 |
ソースコード
#ifndef INCLUDED_MAIN #define INCLUDED_MAIN #include __FILE__ int main(){ ll n; cin>>n; vl a(n); rep(i,n) cin>>a[i]; vector<ll> lef(n,-1),rig(n,-1); vector<ll> dep(n,-1); dep[0]=0; map<ll,int> mp; mp[a[0]]=0; vector<ll> mam(n,-1); srep(i,1,n-1) { auto it=mp.lower_bound(a[i]); int succ=(it==mp.end() ? -1 : it->second); int pred=(it==mp.begin() ? -1 : prev(it)->second); int par=-1; if(pred<0) par=succ; else if(succ<0) par=pred; else { par=(dep[pred]>dep[succ] ? pred : succ); } mam[i]=par; dep[i]=dep[par]+1; if(a[i]<a[par]) lef[par]=i; else rig[par]=i; mp[a[i]]=i; } vout(dep); cout<<nl; //return 0; vector<bool> lefud(n,false),rigud(n,false); queue<ll> que; vector<ll> childs(n,-1); rep(i,n) { if(rig[i]==-1) rigud[i]=true; if(lef[i]==-1) lefud[i]=true; } rep(i,n) { if(lefud[i]&&rigud[i]) que.push(i); childs[i]=0; } //vout(mam); cout<<nl; while(!que.empty()) { ll now=que.front(); que.pop(); if(now==0) continue; if(childs[mam[now]]==-1) childs[mam[now]]=childs[now]+1; else childs[mam[now]]+=(childs[now]+1); if(lef[mam[now]]==now) lefud[mam[now]]=true; else { //assert(rig[mam[now]]==now); rigud[mam[now]]=true; } if(lefud[mam[now]]&&rigud[mam[now]]) que.push(mam[now]); } vout(childs); cout<<nl; } /////// library zone /////// #else #include <bits/stdc++.h> using namespace std; #define rep(i,n) for(ll i=0;i<n;i++) #define srep(i,l,r) for(ll i=l;i<=r;i++) using ll = long long; using ld = long double; const ll mod=998244353; #define vout(v) for(auto i :v) cout<<i<<" "; #define INF 9223300000000000000ll #define Winf 5e12 #define nl "\n" #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define vl vector<ll> vector<ll> spf; vector<ll> freq; void pfdiv(ll x) { while(x!=1) { freq[spf[x]]++; ll p=spf[x]; while(x%p==0) { x/=p; } } } void PrimeFact(ll N) { // spfをセット, globalなvectorが必要; spf.resize(N+1); for (ll i=0; i<=N; i++) spf[i] = i; for (ll i=2; i*i<=N; i++) { if (spf[i]==i) { for (ll j=i*i ; j<=N ; j+=i) { if (spf[j]==j) { spf[j]=i; } } } } } vector<ll> Erasieve(ll n) { vector<bool> is_prime(n+1, true); is_prime[0] = is_prime[1] = false; for (int i=2;i*i<=n;++i) { if (is_prime[i]) { for (int j=i*i;j<=n;j+=i) is_prime[j] = false; } } vector<ll> primes; srep(i,2,n) { if (is_prime[i]) primes.push_back(i); } return primes; } void no() { cout<<"No"<<nl;} void yes() { cout<<"Yes"<<nl;} void yn(bool a) { cout<<(a ? "Yes":"No")<<nl; } ll sum(vector<ll>& a) { ll ans=0; for(auto i:a) ans+=i; return ans; } #endif