这题的难点在于要倒着去遍历这个序列,求出最终的序列,然后就是求最长上升子序列了。
要求最终的序列,那么维护一颗线段树,节点记录空位的数量cnt。
线段树功能 query:单点更新
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define lc l,m,index<<1
#define rc m+1,r,index<<1|1
#define N 100005
int cnt[N<<2];
int num[N];
int order[N];
int d[N];
int ans[N];
int n;
void build(int l,int r,int index)
{
cnt[index]=r-l+1;
if(l==r)return;
int m=(l+r)>>1;
build(lc);
build(rc);
}
int query(int id,int l,int r,int index)
{
cnt[index]--;
if(l==r)return l;
int m=(l+r)>>1;
if(id>=cnt[index<<1])return query(id-cnt[index<<1],rc);
else return query(id,lc);
}
void LIS()
{
int len=1,i,l,r,m;
d[len]=num[0];
ans[num[0]]=1;
for(i=1;i<n;i++)
{
if(num[i]>d[len])d[&