최장 상승 하위 시퀀스 dp Treap
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define N 100005
#define mp make_pair
#define pa pair<int,int>
#define inf 1<<30
using namespace std;
struct Node{int ls,rs,v,key,sz;}t[N];
void upd(int k){t[k].sz=t[t[k].ls].sz+t[t[k].rs].sz+1;}
int num,root,n,x,cnt,a[N],d[N],ans[N],da[N];
int merge(int a,int b){
if(a==0||b==0) return a+b;
if(t[a].key<t[b].key){t[a].rs=merge(t[a].rs,b);upd(a);return a;}
else {t[b].ls=merge(a,t[b].ls);upd(b);return b;}
}
pa split(int k,int x){
if(x==0) return mp(0,k);
int ls=t[k].ls,rs=t[k].rs;pa tmp;
if(t[ls].sz==x) {t[k].ls=0;upd(k);return mp(ls,k);}
if(t[ls].sz==x-1) {t[k].rs=0;upd(k);return mp(k,rs);}
if(t[ls].sz>x) {tmp=split(ls,x);t[k].ls=tmp.second;upd(k);return mp(tmp.first,k);}
if(t[ls].sz<x-1) {tmp=split(rs,x-t[ls].sz-1);t[k].rs=tmp.first;upd(k);return mp(k,tmp.second);}
}
void ins(int x,int v){
int k=x-1;
t[++num].ls=0;t[num].rs=0;t[num].sz=1;
t[num].v=v;t[num].key=rand();
pa tmp=split(root,k);
root=merge(tmp.first,num);
root=merge(root,tmp.second);
}
void dfs(int i){
if(!i) return;
dfs(t[i].ls);
a[++cnt]=i;
dfs(t[i].rs);
}
void getans(){
memset(d,127,sizeof(d));
d[0]=-inf;d[1]=a[1];ans[a[1]]=1;
int len=1;
for(int i=2;i<=n;i++){
int pos=upper_bound(d,d+len,a[i])-d;
if(a[i]>d[len]) d[++len]=a[i],ans[a[i]]=len;
else d[pos]=min(d[pos],a[i]),ans[a[i]]=pos;
}
for(int i=1;i<=n;i++) ans[i]=max(ans[i],ans[i-1]);
for(int i=1;i<=n;i++) printf("%d
",ans[i]);
}
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&x),ins(x+1,i);
dfs(root);
getans();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.