首先在开头加上-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. cocos2d 如何优化内存使用

    如何优化内存使用 内存优化原理 为优化应用内存使用,开发人员首先应该知道什么最耗应用内存,答案就是纹理! 纹理几乎会占据90%应用内存.所以尽量最小化应用的纹理内存使用,否则应用很有可能会因为低内存而 ...

  2. Python序列切片的注意事项

    a=[1,2,3,4,5,6,7,8,9,10] 1)普通切片,形如array[m:n],只包含起始索引m,和不被包含在结果内的终点索引n, 注意终点索引可以大于序列的大小(长度),若终点索引大于序列 ...

  3. iOS 定义圆角控件

    ios7 以前,想把UILabel变为圆角的,只需要设置layer的 cornerRadius属性,ios7以后,还需要设置 masksToBounds = true. 以下是这个属性的说明 A Bo ...

  4. php字符串处理总结

    php字符串处理是php基础中重要的一部分,总结并整理了一下 1.最简单的,字符串输出单引号和双引号的区别(定义字符串用单引号和双引号都可以) $str='hello'; echo "str ...

  5. (原创)Python文件与文件系统系列(5)——stat模块

    stat模块中定义了许多的常量和函数,可以帮助解释 os.stat().os.fstat().os.lstat()等函数返回的 st_result 类型的对象. 通常使用 os.path.is*() ...

  6. codeforces 485A.Factory 解题报告

    题目链接:http://codeforces.com/problemset/problem/485/A 题目意思:给出 a 和 m,a 表示第一日的details,要求该日结束时要多生产 a mod ...

  7. Extjs中给同一个GridPanel中的事件添加参数的方法

    Extjs中给同一个GridPanel中的事件添加参数的方法: this.isUse = new Ext.Action({            text:'启用',            scope ...

  8. HDU1267 递推

    下沙的沙子有几粒? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  9. JQuery的ajax登录案例

    1.简单版AjaxLogin.html代码: <head> <title></title> <script src="jquery-1.8.3.js ...

  10. SqlHelper类的使用

    SqlHelper.cs public static class SqlHelper { private static readonly string conStr = ConfigurationMa ...