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

题目大意:

给你一个长度为\(n(n\le10^5)\)的整数序列,其中有一些数已经模糊不清了,现在请你任意确定这些整数的值,使得最长上升子序列最长。求最长长度。

思路:

一定存在一种最优方案使得不确定的都选上(考虑新选上一个不确定的数,最多会使一个已确定的数失效),因此令\(a_i=a_i-cnt\)(\(cnt\)为之前不确定的数的个数),求LIS后加上\(cnt\)即可。

源代码:

#include<cstdio>
#include<cctype>
#include<climits>
#include<algorithm>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) neg|=ch=='-';
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return neg?-x:x;
}
inline char getupper() {
register char ch;
while(!isupper(ch=getchar()));
return ch;
}
const int N=1e5+1;
int a[N],tmp[N];
class FenwickTree {
private:
int val[N];
int lowbit(const int &x) const {
return x&-x;
}
public:
void modify(int p,const int &x) {
for(;p<=tmp[0];p+=lowbit(p)) {
val[p]=std::max(val[p],x);
}
}
int query(int p) const {
int ret=0;
for(;p;p-=lowbit(p)) {
ret=std::max(ret,val[p]);
}
return ret;
}
};
FenwickTree bit;
int main() {
const int n=getint();
int cnt=0;
for(register int i=1;i<=n;i++) {
if(getupper()=='K') {
a[i]=tmp[i-cnt]=getint()-cnt;
} else {
a[i]=INT_MAX;
cnt++;
}
}
std::sort(&tmp[1],&tmp[n-cnt]+1);
tmp[0]=std::unique(&tmp[1],&tmp[n-cnt]+1)-&tmp[1];
for(register int i=1;i<=n;i++) {
if(a[i]==INT_MAX) continue;
a[i]=std::lower_bound(&tmp[1],&tmp[tmp[0]]+1,a[i])-tmp;
bit.modify(a[i],bit.query(a[i]-1)+1);
}
printf("%d\n",bit.query(tmp[0])+cnt);
return 0;
}

[BZOJ5427]最长上升子序列/[BZOJ4282]慎二的随机数列的更多相关文章

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

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

  2. bzoj4282慎二的随机数列

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

  3. BZOJ4282 : 慎二的随机数列

    首先在开头加上-inf,结尾加上inf,最后答案减2即可. 设s[i]为i之前未知的个数,f[i]为以i结尾的LIS,且a[i]已知,那么: f[i]=max(f[j]+min(s[i]-s[j],a ...

  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. [BZOJ5427]最长上升子序列

    考虑O(n log n)的LIS求法,dp[i]表示到目前为止,长度为i的LIS的末尾最小是多少. 当当前数确定时直接用LIS的求法更新dp数组,当不确定时,由于这个数可以是任意数,所以可以接在任意上 ...

  9. 动态规划———最长公共子序列(LCS)

    最长公共子序列+sdutoj2080改编: http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/ ...

随机推荐

  1. Device Tree常用方法解析【转】

    转自:https://blog.csdn.net/airk000/article/details/21345159 Device Tree常用方法解析 Device Tree在Linux内核驱动中的使 ...

  2. dubbo系列五、dubbo核心配置

    一.配置文件 1.生产者配置provider.xml <?xml version="1.0" encoding="UTF-8"?> <bean ...

  3. adb启动和停止android app方法

    一.启动app adb shell am start  包名/MainActivity 上面涉及到的包名及mainactivity获取办法 方法一: 1.adb shell 2.dumpsys act ...

  4. 单例模式(懒汉、饿汉、同步锁、static、枚举)实现

    使用前提: 需要频繁的进行创建和销毁的对象,创建对象时耗时过多或耗费资源过多 三要素: 1.构造方法私有化: 2.实例化的变量引用私有化: 3.获取实例的方法共有. 1.饿汉式单例 弊端:在类装载的时 ...

  5. SpringBoot入门小案例

    1.创建一个简单的maven project项目 2.下面来看一下项目结构: 3.pom.xml 配置jar包 <parent> <groupId>org.springfram ...

  6. LeetCode(34):搜索范围

    Medium! 题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果 ...

  7. 【splunk】用正则表达式提取字段

    设input输入数据为 http://192.168.23.121/xxx  想提取出里面的ip,可以用rex source="xxx.csv" |rex field=input ...

  8. web----框架基础

    Web框架本质: 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 真实开发中的python web程序来说,一般会分为两部分:服务器 ...

  9. hdu2888 二维ST表(RMQ)

    二维RMQ其实和一维差不太多,但是dp时要用四维 /* 二维rmq */ #include<iostream> #include<cstring> #include<cs ...

  10. Python中的各种转义符\n\r\t

    转义符 描述 \ 续行符(在行尾时) \\ 反斜杠符号 ' 单引号 " 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n 换行 \v 纵向制表符 \t 横 ...