题意:

将一个序列分成两个序列,两个序列中元素的相对顺序保持和原序列不变,使得分出的两个序列一个严格上升,一个严格下降。

思路:

我们考虑每个元素都要进入其中一个序列。

那么我们维护一个上升序列和一个下降序列,对于当前元素$i$:

如果它只能确定的进入一个序列,那么就让它进入。

如果它一个序列也进不去,那么答案就是'NO'。

如果它两个序列都可以进去,那么判断它和后一个元素(如果存在的话)的关系,如果它后一个元素比它大,那么让它进去上升序列,否则进去下降序列。

考虑这样为什么是对的:

首先我们知道一个存在答案的序列里面的元素重复度最大是$2$,那么对于上述的第三种操作,我们考虑一种最特殊的情况,

就是对于第一个元素的判断,它显然可以进入任意一个序列,但是至于让它进入哪个序列,我们不知道。

但是一个比较直观的感觉是,如果它和剩下的数相比相对来说是较大的,我们倾向于让它进入下降序列,反之,进入上升序列

那么其实不用跟剩下的所有数比,只需要让它和后一个数比一下即可。

因为这一步比较,相当于让这个数强行接在后一个数的前面,可以等价于去掉这个数,(做不了选择就不做选择了嘛

但是后一个数跟它相等怎么办?

相等,就两个序列分别进一个呗。

 #include <bits/stdc++.h>
using namespace std; #define N 200010
#define INF 0x3f3f3f3f
int n, arr[N];
vector <int> A, B;
int used[N]; void solve()
{
A.clear(), B.clear();
memset(used, , sizeof used);
A.push_back(-);
B.push_back(INF);
for (int i = ; i <= n; ++i)
{
int x = arr[i], a = A.back(), b = B.back(), y;
if (x <= a && x >= b)
{
puts("NO");
return;
}
else if (x > a && x < b)
{
if (i == n)
used[i] = ;
else
{
y = arr[i + ];
if (y > x)
A.push_back(x);
else
{
B.push_back(x);
used[i] = ;
}
}
}
else if (x > a)
A.push_back(x);
else
{
used[i] = ;
B.push_back(x);
}
}
puts("YES");
for (int i = ; i <= n; ++i)
printf("%d%c", used[i], " \n"[i == n]);
} int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; ++i) scanf("%d", arr + i);
solve();
}
return ;
}

Codeforces 1144G Two Merged Sequences的更多相关文章

  1. Codeforces 1144G Two Merged Sequences dp

    Two Merged Sequences 感觉是个垃圾题啊, 为什么过的人这么少.. dp[ i ][ 0 ]表示处理完前 i 个, 第 i 个是递增序列序列里的元素,递减序列的最大值. dp[ i ...

  2. 1144G Two Merged Sequences ( 贪心+构造)

    题目:https://codeforces.com/problemset/problem/1144/G 题意: 将一个序列分成两个序列,两个序列中元素的相对顺序保持和原序列不变,使得分出的两个序列一个 ...

  3. Codeforces #550 (Div3) - G.Two Merged Sequences(dp / 贪心)

    Problem  Codeforces #550 (Div3) - G.Two Merged Sequences Time Limit: 2000 mSec Problem Description T ...

  4. CodeForces 450B Jzzhu and Sequences (矩阵优化)

    CodeForces 450B Jzzhu and Sequences (矩阵优化) Description Jzzhu has invented a kind of sequences, they ...

  5. Two Merged Sequences CodeForces - 1144G (暴力)

    大意: 给定序列, 求划分为一个严格递增子序列和一个严格递减子序列, 可以为空. 跟 125D 类似的一个题, 直接暴力dfs, 用当前序列长度来剪枝, 状态不会太多, 但是会被一些数据卡掉, 特判一 ...

  6. codeforces 446A DZY Loves Sequences

    vjudge 上题目链接:codeforces 446A 大意是说最多可以修改数列中的一个数,求最长严格递增的连续子序列长度. 其实就是个 dp 的思想,想好思路后交上去没想到一直 wa 在第二个测试 ...

  7. codeforces C. DZY Loves Sequences

    http://codeforces.com/contest/447/problem/C 题意:给你n个数的序列,然后让你改变其中的一个数,求得最长上升连续序列的长度值. 思路:先从左边开始求出连续递增 ...

  8. Codeforces 264 B. Good Sequences

    B. Good Sequences time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  9. Codeforces 447C - DZY Loves Sequences

    447C - DZY Loves Sequences 思路:dp 代码: #include<bits/stdc++.h> using namespace std; #define ll l ...

随机推荐

  1. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十九:SDRAM模块② — 多字读写

    实验十九:SDRAM模块② — 多字读写 表示19.1 Mode Register的内容. Mode Register A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A ...

  2. 严版数据结构题集2.13 & 2.14

    1.试写一算法在带头结点的单链表结构上实现线性表操作Locate(L,x) 2.试写一算法在带头结点的单链表结构上实现线性表操作Length(L) #include<stdio.h> #i ...

  3. 手写代码UI,xib和StoryBoard间的的优劣比较

    在UI制作方面,逐渐分化三种主要流派:使用代码手写UI:使用单个xib文件组织viewController或者view:使用StoryBoard来通过单个或很少的几个文件构建UI.三种方式各有优劣,也 ...

  4. linux使用bin文件安装jdk

    jdk1.6.20文件为bin文件安装过程如下 添加执行权限 chmod +x jdk-6u20-linux-x64.bin 运行,出现提示需要输入yes ./jdk-6u20-linux-x64.b ...

  5. Python中各种括号的区别、用途及使用方法

    python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. python中的小括号( ):代表 ...

  6. 2018牛客网暑期ACM多校训练营(第三场) H - Shuffle Cards - [splay伸展树][区间移动][区间反转]

    题目链接:https://www.nowcoder.com/acm/contest/141/C 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  7. 畅通工程 HDU - 1863 最小生成树模板

    两个模板: kruskal #include<stdio.h> #include<queue> #include<algorithm> #include<io ...

  8. 快速排序之python

    快速排序( Quick sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行递归排序,以达到整个序列有 ...

  9. Java不同压缩算法的性能比较 程序猿 2015-01-21 本文将会对常用的几个压缩算法的

    Java不同压缩算法的性能比较 程序猿 2015-01-21 本文将会对常用的几个压缩算法的

  10. CyanogenMod---android

    http://blog.csdn.net/sheldon4090/article/details/7736957--service. android进程间通信:使用AIDL http://blog.c ...