【清真dp】cf1144G. Two Merged Sequences
成就:赛后在cf使用错误的贪心通过一题
成就:在cf上赛后提交hack数据
成就:在cf上赛后hack自己
题目大意
有一长度$n \le 2\times 10^5$的序列,要求判断是否能够划分为一个严格递增和一个严格递减的子序列并给出划分方案。
题目分析
错误的贪心
截止现在(4.22),这一种错误贪心尚可以通过此题。
算法流程:考虑处理出一个LIS和一个LDS,并检查剩下的元素是否为LDS/LIS.
这个算法在随机构造下是基本没问题的(因此跑了47000+组随机数据才rand出一组反例)。
事实上,如果枚举每一个LIS/LDS,这个做法就是显然正确的,但是复杂度会有相当影响(例如一个完全非法但是LIS/LDS非常多的数列)
清真dp
记$f_{i,0}$为:$i$处在一个上升子序列中,$1\cdots i-1$的下降子序列最高为$f_{i,0}$;$f_{i,1}$同理。
这个状态显然是需要贪心取最大/最小的,那么这个转移就可以做到$O(1)$,相当高效。
#include<bits/stdc++.h>
const int maxn = ;
const int INF = 2e9; int n,a[maxn],p[maxn][],f[maxn][]; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
void print(int x, int c)
{
if (x > ) print(x-, p[x][c]);
printf("%d ",c);
}
int main()
{
n = read();
for (int i=; i<=n; i++) a[i] = read();
f[][] = INF, f[][] = -INF;
for (int i=; i<=n; i++)
{
f[i][] = -INF, f[i][] = INF;
if (a[i] > a[i-]&&f[i][] < f[i-][]) f[i][] = f[i-][], p[i][] = ;
if (a[i] < a[i-]&&f[i][] > f[i-][]) f[i][] = f[i-][], p[i][] = ;
if (a[i] > f[i-][]&&f[i][] < a[i-]) f[i][] = a[i-], p[i][] = ;
if (a[i] < f[i-][]&&f[i][] > a[i-]) f[i][] = a[i-], p[i][] = ;
}
if (f[n][]!=-INF) puts("YES"), print(n, ), exit();
if (f[n][]!=INF) puts("YES"), print(n, ), exit();
puts("NO");
return ;
}
END
【清真dp】cf1144G. Two Merged Sequences的更多相关文章
- Codeforces #550 (Div3) - G.Two Merged Sequences(dp / 贪心)
Problem Codeforces #550 (Div3) - G.Two Merged Sequences Time Limit: 2000 mSec Problem Description T ...
- Codeforces 1144G Two Merged Sequences dp
Two Merged Sequences 感觉是个垃圾题啊, 为什么过的人这么少.. dp[ i ][ 0 ]表示处理完前 i 个, 第 i 个是递增序列序列里的元素,递减序列的最大值. dp[ i ...
- 【(待重做)树状数组+dp+离散化】Counting Sequences
https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/G [题意] 给定一个数组a,问这个数组有多少个子序列,满足子序列中任意两个相邻数 ...
- Codeforces 1144G Two Merged Sequences
题意: 将一个序列分成两个序列,两个序列中元素的相对顺序保持和原序列不变,使得分出的两个序列一个严格上升,一个严格下降. 思路: 我们考虑每个元素都要进入其中一个序列. 那么我们维护一个上升序列和一个 ...
- 1144G Two Merged Sequences ( 贪心+构造)
题目:https://codeforces.com/problemset/problem/1144/G 题意: 将一个序列分成两个序列,两个序列中元素的相对顺序保持和原序列不变,使得分出的两个序列一个 ...
- Two Merged Sequences CodeForces - 1144G (暴力)
大意: 给定序列, 求划分为一个严格递增子序列和一个严格递减子序列, 可以为空. 跟 125D 类似的一个题, 直接暴力dfs, 用当前序列长度来剪枝, 状态不会太多, 但是会被一些数据卡掉, 特判一 ...
- CF集萃3
CF1118F2 - Tree Cutting 题意:给你一棵树,每个点被染成了k种颜色之一或者没有颜色.你要切断恰k - 1条边使得不存在两个异色点在同一连通块内.求方案数. 解:对每颜色构建最小斯 ...
- The algorithm learning of sort which include Bubblesort,Insertsort,Quicksort and Mergesort.
Notice : these algorithms achieved by Java. So,let's going to it. firstly, what is Bubblesort? why w ...
- CF550 DIV3
A - Diverse Strings CodeForces - 1144A A string is called diverse if it contains consecutive (adjace ...
随机推荐
- 计算机为什么要区别C盘,D盘,E盘等?
为什么要区分C盘,D盘,E盘,F盘? 1)各盘出现背景 在计算机刚诞生的年代,还没有硬盘,那时数据存储主要靠软盘.软盘驱动器按照顺序占据了A和B盘符的位置,后来随着硬盘的应用,就出现了C盘及以后的 ...
- pat1094. The Largest Generation (25)
1094. The Largest Generation (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- java的wait/notify小结
wait()是使线程停止运行,而notify使停止的线程继续运行 wait()锁释放与notify()锁不释放 当线程呈wait状态时,调用线程对象的interrupt()方法会出现异常 带一个参数的 ...
- textarea输入框显隐文字
html: <textarea class="dxtd_text"></textarea> javascript: //管理端短信 var textarea ...
- 修改默认 JVM 参数 securerandom.source
最近在云服务器上部署tomcat的时候,执行 startup.sh老是卡住了. 开始以为是日志配的不对,因为在对象中引入的是slf4,不是apache的log4j,后面把所有引入的地方都修改为Apac ...
- Intellij IDEA 配置jrebel热部署
Jrebel 先介绍一下jrebel,jrebel是可以热部署项目的一个工具,更改代码自动部署并不需要重启项目(在spring中的controller中,增加.修改方法都是可以进行热部署而不需要重启的 ...
- css 引入方式以及css的选择器
一.css的引入方式: 1.行内样式 <div> <p style="color: red">我是一个段落</p> </div> 2 ...
- C++ Knowledge series 3
Programming language evolves always along with Compiler's evolvement The Semantics of Data The size ...
- 【起航计划 020】2015 起航计划 Android APIDemo的魔鬼步伐 19 App->Dialog Dialog样式
这个例子的主Activity定义在AlertDialogSamples.java 主要用来介绍类AlertDialog的用法,AlertDialog提供的功能是多样的: 显示消息给用户,并可提供一到三 ...
- 【Android 界面效果46】自定义view常处理的回调方法
onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int, ...