結果
問題 |
No.3134 二分探索木
|
ユーザー |
|
提出日時 | 2025-05-02 22:15:40 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,180 bytes |
コンパイル時間 | 2,423 ms |
コンパイル使用メモリ | 206,484 KB |
実行使用メモリ | 18,852 KB |
最終ジャッジ日時 | 2025-05-02 22:15:46 |
合計ジャッジ時間 | 6,793 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 8 TLE * 1 -- * 6 |
ソースコード
#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; vector<ll> mam(n,-1); srep(i,1,n-1) { ll cing=0; while(true) { if(a[i]<a[cing]) { if(lef[cing]==-1) { lef[cing]=i; mam[i]=cing; dep[i]=dep[cing]+1; break; } else cing=lef[cing]; } else { if(rig[cing]==-1) { rig[cing]=i; mam[i]=cing; dep[i]=dep[cing]+1; break; } else cing=rig[cing]; } } } 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