首先在开头加上-inf,结尾加上inf,最后答案减2即可。

设s[i]为i之前未知的个数,f[i]为以i结尾的LIS,且a[i]已知,那么:

f[i]=max(f[j]+min(s[i]-s[j],a[i]-a[j]-1))+1,其中j<i,a[j]<a[i]且a[j]已知

将min分类讨论后可转化为三维偏序,CDQ分治+扫描线+树状数组即可,时间复杂度$O(n\log^2n)$。

#include<cstdio>
#include<algorithm>
using std::sort;
const int N=100010,inf=1000000000;
char ch[5];
int n,m,i,a[N],s[N],b[N],c[N],B[N],C[N<<1],f[N],g[N];
int qa[N],qb[N],ca,cb,T,pos0[N],bit0[N],pos1[N<<1],bit1[N<<1];
inline int cmp(int x,int y){return a[x]<a[y];}
inline int lowerb(int x){
int l=1,r=m,mid,t;
while(l<=r)if(B[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline int lowerc(int x){
int l=1,r=n,mid,t;
while(l<=r)if(C[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline void up(int&a,int b){if(a<b)a=b;}
inline void add0(int x,int y){for(;x<=m;x+=x&-x)if(pos0[x]<T)pos0[x]=T,bit0[x]=y;else up(bit0[x],y);}
inline void ask0(int&t,int x){for(;x;x-=x&-x)if(pos0[x]==T)up(t,bit0[x]);}
inline void add1(int x,int y){for(;x<=n;x+=x&-x)if(pos1[x]<T)pos1[x]=T,bit1[x]=y;else up(bit1[x],y);}
inline void ask1(int&t,int x){for(;x;x-=x&-x)if(pos1[x]==T)up(t,bit1[x]);}
void solve(int l,int r){
if(l==r){
f[l]+=s[l]+1,g[l]+=a[l];
if(l==1)f[l]=1;
up(f[l],g[l]);
return;
}
int mid=(l+r)>>1;
solve(l,mid);
int i,j;
ca=cb=0;
for(i=l;i<=mid;i++)qa[ca++]=i;
for(i=r;i>mid;i--)qb[cb++]=i;
sort(qa,qa+ca,cmp),sort(qb,qb+cb,cmp);
for(T++,i=j=0;i<cb;i++){
while(j<ca&&a[qa[j]]<a[qb[i]]){
add0(b[qa[j]],f[qa[j]]-s[qa[j]]);
add1(lowerc(c[qa[j]]-1),f[qa[j]]-a[qa[j]]);
j++;
}
ask0(f[qb[i]],b[qb[i]]-1);
ask1(g[qb[i]],lowerc(c[qb[i]]));
}
solve(mid+1,r);
}
int main(){
scanf("%d",&n);
a[m=1]=-inf;
while(n--){
scanf("%s",ch);
if(ch[0]=='N')i++;else s[++m]=i,scanf("%d",&a[m]);
}
s[++m]=i,a[m]=inf;
for(n=0,i=1;i<=m;i++){
B[i]=b[i]=a[i]-s[i];
C[++n]=c[i]=s[i]-a[i];
C[++n]=c[i]-1;
f[i]=g[i]=-inf;
}
sort(B+1,B+m+1),sort(C+1,C+n+1);
for(i=1;i<=m;i++)b[i]=lowerb(b[i]);
solve(1,m);
return printf("%d",f[m]-2),0;
}

  

BZOJ4282 : 慎二的随机数列的更多相关文章

  1. [BZOJ5427]最长上升子序列/[BZOJ4282]慎二的随机数列

    [BZOJ5427]最长上升子序列/[BZOJ4282]慎二的随机数列 题目大意: 给你一个长度为\(n(n\le10^5)\)的整数序列,其中有一些数已经模糊不清了,现在请你任意确定这些整数的值,使 ...

  2. [bzoj4282]慎二的随机数列_动态规划_贪心

    慎二的随机数列 bzoj-4282 题目大意:一个序列,序列上有一些数是给定的,而有一些位置上的数可以任意选择.问最长上升子序列. 注释:$1\le n\le 10^5$. 想法:结论:逢N必选.N是 ...

  3. bzoj4282慎二的随机数列

    海带头又上线了QwQ~ 这是一个奇怪的lis问题 显然一定存在一种最优答案使所有辨认不清的数都在答案中. [为什么呢]因为你完全可以用一个'N'来替换一个'K'啊QwQ~ 那么在选完所有'N'之后,一 ...

  4. bzoj4282 慎二的随机数列 树状数组求LIS + 构造

    首先,我们不难发现N个位置都选一定不会比少选任意几个差,所以我们就先设定我们将这N个修改机会都用上, 那么如果点 i">ii 前有sumv">sumvsumv个可修改点 ...

  5. 【BZOJ4282】慎二的随机数列 乱搞

    [BZOJ4282]慎二的随机数列 Description 间桐慎二是间桐家著名的废柴,有一天,他在学校随机了一组随机数列, 准备使用他那强大的人工智能求出其最长上升子序列,但是天有不测风云,人有旦夕 ...

  6. 【bzoj4282】慎二的随机数列

    扯几句题外的,最近在看Fate/StayNight,对此人毫无好感…… 每次减一下当前可辨认数,然后随意dp一个LIS,最后记得加回去就好. #include<bits/stdc++.h> ...

  7. BZOJ 4282(慎二的随机数列

    题解: 网上题解还没看 我的方法是用平衡树维护一个单调栈 由于N用了一定是赚的 所以它的作用是让f[i+1]=f[i]+1 这个是可以记录的 就跟noip蚯蚓那题一样 然后插入一个值的时候查询前面的最 ...

  8. js生成随机数、随机数列、数值转金融格式

    随机数的生成:min到max之间,包括两者自身 parseInt(Math.random()*(max-min+1)+min,10); Math.floor(Math.random()*(max-mi ...

  9. 给定随机数列求第k大的数字

    原来STL我还是有很多不知道的地方 STL 采用的算法是: 当数组长度 <= 3时, 采用插入排序. 当长度 > 3时, 采用快排 Partition 的思想,也就是说类似快速排序(这里不 ...

随机推荐

  1. ios流媒体

    http://my.oschina.net/CgShare/blog/302303 渐进式下载(伪流媒体) 介于下载本地播放与实时流媒体之间的一种播放形式,下载本地播放必须全部将文件下载完成后才能播放 ...

  2. 如何用rake tasks 生成migration对应的sql

    how-to-use-rake-tasks-to-generate-migration-sql Rakefile文件里有load_tasks的方法 http://api.rubyonrails.org ...

  3. c# 继承,多态,new /overrid 区别, 引用父类的方法

    好久没碰c#了,偶尔需要制作点小工具.为了一个灵活的架构设计,需要对继承/多态有比较深刻的理解. 不料忘得差不多了,好吧,再来回忆下.直接上代码了,如下: using System; using Sy ...

  4. 【js】将table的每个td的内容自动赋值给其title属性

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. linux安装setup工具

    如果你的Linux系统是最小化安装的,可能会没有setup命令工具,环境是centos 5.8 安装setup命令工具的步骤. 安装setuptool #yum install setuptool 系 ...

  6. ORM框架是什么

    ORM框架是什么 对象关系映射,目前数据库是关系型数据库  ORM 主要是把数据库中的关系数据映射称为程序中的对象 目前集中常见的ORM框架1  Nhibernate原因:用的比较多,资料也比较好找. ...

  7. poj 1833

    http://poj.org/problem?id=1833 next_permutation这个函数是用来全排列的,按字典的序进行排列,当排列无后继的最大值时,会执行字典升序排列,相当于排序: 当排 ...

  8. Linux下配置JDK

    下面以CentOS为例,详细说一下Linux下配置JDK的过程 首先按照约定俗成的习惯,将jdk放在/usr/local/java下,首先进入/usr/local然后新建一个目录java 然后我们需要 ...

  9. JavaScript设计模式 - 代理模式

    代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问 代理模式的用处(个人理解):为了保障当前对象的单一职责(相对独立性),而需要创建另一个对象来处理调用当前对象之前的一些逻辑以提高代码的效 ...

  10. HDU 5805 NanoApe Loves Sequence (思维题) BestCoder Round #86 1002

    题目:传送门. 题意:题目说的是求期望,其实翻译过来意思就是:一个长度为 n 的数列(n>=3),按顺序删除其中每一个数,每次删除都是建立在最原始数列的基础上进行的,算出每次操作后得到的新数列的 ...