虽然分类在数据结构里,但是实际上是个贪心题......

我自己一开始想到了一个错误的贪心。后来发现对于相等值的处理不行。

有个很神的转化,就是把排好序的队列以及对应的原下标都给搞出来。

然后考虑其中一段:若这一段属于同一个双端队列,那么原下标一定呈单谷状。

相等的值如何处理呢?因为相等的值可以任意在排序后的序列里交换位置,所以我们可以任意设计它们的原下标而达到单谷状态来为我们所用。

所以特判一下就好了。时间O(nlogn),因为有排序。

(惨痛的教训:把 == 写成了 = )

 /**************************************************************
Problem: 2457
Language: C++
Result: Accepted
Time:452 ms
Memory:3948 kb
****************************************************************/ #include <cstdio>
#include <algorithm>
const int N = ; struct Number {
int val, num, num_up;
bool del;
bool operator < (const Number &x) const {
if(val != x.val) {
return val < x.val;
}
return num < x.num;
}
}num[N]; int main() {
//freopen("in.in", "r", stdin);
//freopen("my.out", "w", stdout);
int n;
scanf("%d", &n);
for(int i = ; i <= n; i++) {
scanf("%d", &num[i].val);
num[i].num = num[i].num_up = i;
}
std::sort(num + , num + n + ); int t = ;
for(int i = ; i <= n; i++) { /// 去重
if(num[i].val == num[t].val) {
num[t].num_up = num[i].num;
num[i].del = ;
}
else {
t = i;
}
} int now = num[].num;
int k = ;/// 1 up 2 down
int ans = ; for(int i = ; i <= n; i++) {
if(num[i].del) {
continue;
}
if(num[i].num == num[i].num_up) {
bool f = num[i].num < now;
if(k == ) { /// up
if(f) {
ans++;
k = ;
}
}
else { /// k == 2 down
if(!f) {
k = ;
}
}
now = num[i].num;
}
else { /// 多个
if(k == ) { /// up
if(num[i].num > now) {
now = num[i].num_up;
}
else if(num[i].num_up < now) {
ans++;
k = ;
now = num[i].num;
}
else { /// 中间
ans++;
k = ;
now = num[i].num;
}
}
else { /// down
if(num[i].num > now) {
k = ;
now = num[i].num_up;
}
else if(num[i].num_up < now) {
now = num[i].num;
}
else { /// 中间
k = ;
now = num[i].num_up;
}
}
}
//printf("%d %d %d %d\n", num[i].val, ans, k, now);
}
printf("%d", ans);
return ;
}

AC代码

bzoj2457 双端队列的更多相关文章

  1. BZOJ2457 双端队列 题解

    本题直接求解十分困难,因为在不知道整个序列的数字规律时当前所作决策都无法保证最优性. 考虑正难则反,题目转化为将一个非降序列分成尽量少的几段,让每段对应原问题的双端队列. 先将原数组排序,由于原数组下 ...

  2. 【BZOJ2457】[BeiJing2011]双端队列 贪心+模拟

    [BZOJ2457][BeiJing2011]双端队列 Description        Sherry现在碰到了一个棘手的问题,有N个整数需要排序.        Sherry手头能用的工具就是若 ...

  3. BZOJ2457 BeiJing2011 双端队列

    [问题描述] Sherry现在碰到了一个棘手的问题,有N个整数需要排序.  Sherry手头能用的工具就是若干个双端队列.        她需要依次处理这N个数,对于每个数,Sherry能做以下两件事 ...

  4. [BZOJ2457][BeiJing2011]双端队列 (单调性)

    正如lyd所说,和数据结构本身没什么太大关联 题意 中文题面   Sherry现在碰到了一个棘手的问题,有N个整数需要排序.        Sherry手头能用的工具就是若干个双端队列.        ...

  5. BZOJ2457 [BeiJing2011]双端队列 【贪心】

    题目 Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事: 1.新建一个双端队列 ...

  6. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

  7. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  8. STL---deque(双端队列)

    Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结 ...

  9. hdu-5929 Basic Data Structure(双端队列+模拟)

    题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

随机推荐

  1. 小程序和H5互调

    小程序跳H5页面 https://blog.csdn.net/mytljp/article/details/81030687(copy) H5页面跳小程序 https://blog.csdn.net/ ...

  2. Notepad++ 安装 NppFTP 插件

    How to install a plugin The plugin (in the DLL form) should be placed in the \plugins subfolder of t ...

  3. vue+webpack项目打包后背景图片加载不出来问题解决

    在做VUE +的WebPack脚手架项目打包完成后,在IIS服务器上运行发现项目中的背景图片加载不出来检查项目代码发现是因为CSS文件中,背景图片引用的路径问题;后来通过修改配置文件,问题终于解决了, ...

  4. drf 之序列化组件

    序列化 把Python中对象转换为json格式字符串 反序列化 把json格式转为为Python对象. 用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串. 序列化两大功能 ...

  5. 第四周作业&&结对编程

    1. 结对编程. 本周开始,和我结对编程的小伙伴是齐嘉亮(博客:http://www.cnblogs.com/zhengrui0452/). 因为这周需要发布四人团队项目的alpha版本,刚好我和亮哥 ...

  6. java学习之—递归实现变位字

    /** * 递归实现变位字 * Create by Administrator * 2018/6/20 0020 * 上午 10:23 **/ public class AnagramApp { st ...

  7. python易混易乱(2)

    字符串切割成列表: 以str为分隔符切片mystr,如果maxsplit有指定值,则仅分割maxsplit个字符串,得到maxsplit个字符串的列表 利用字符串的split() 方法 >> ...

  8. Ubuntu16.04网络不能访问解决办法

      问题: 系统重启后,网络不能正常使用,加载网络配置失败,且重启网络时也提示错误. 解决方法: 在定位的过程中发现是配置中的网络设备号与实际设备号不符. 1.查看网络配置中的配备号: vi /etc ...

  9. 四、K8S

    一.查看日志 journalctl -xeu kubelet

  10. JS--bom对象:borswer object model浏览器对象模型

    bom对象:borswer object model浏览器对象模型 navigator获取客户机的信息(浏览器的信息) navigator.appName;获得浏览器的名称 window:窗口对象 a ...