Description
给定一个序列,初始为空。现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少?
Input
第一行一个整数N,表示我们要将1到N插入序列中,接下是N个数字,第k个数字Xk,表示我们将k插入到位置Xk(0<=Xk<=k-1,1<=k<=N)
Output
N行,第i行表示i插入Xi位置后序列的最长上升子序列的长度是多少。
Solution
因为后插进去的优先级更高,考虑倒序解决这个问题。
通过倒序插入确定了每一个点的真正位置。
不过需要注意后面已经插入的对前面的影响。
所以通过二分确定位置pos。
答案pos=后面在位置pos前插的个数+这次操作插的位置x
然后按正常逆序对做就行了。
Code
#include<bits/stdc++.h>
using namespace std;
int a[210010],n;
int pos[210010];
int sum[210010];
int p[210010];
int lowbit(int x){
return x&-x;
}
void add(int pos,int x){
for(