bzoj1046题解
阅读原文时间:2023年07月11日阅读:1

【解题思路】
先倒着求一遍[LIS](http://baike.baidu.com/link?url=4kt5xAPmWOYTEdhIzB0eTu4pVy698690P3bBODUptMCHcGQDbbygSELHs82ROy-rCVG3dS3vQzqFlTMRbwXPfq),然后对于每个询问L从左到右找到第一个大于等于L的上升序列即可。复杂度O(N(log2N+M))。
【参考代码】

```C++
#pragma GCC optimize(2)
#include
#include
#include
#include
#define REP(i,low,high) for(register int i=(low);i=(low);--i)
using namespace std;

//ex_cmp {

template inline bool getcmp(T &target,const T &pattern,Compare comp)

{

return comp(pattern,target)?target=pattern,1:0;

}

//} ex_cmp

static int n,m; int a[10010],f[10010]={0},r[10010]={0x7fffffff};

int main()

{

scanf("%d",&n); REP(i,1,n) scanf("%d",a+i); int top=0; PER(i,n,1)

{

int pos=lower_bound(r+1,r+top+1,a[i],greater())-r;

getcmp(top,pos,greater()),r[f[i]=pos]=a[i];

}

for(scanf("%d",&m);m--