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

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

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

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

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

所以特判一下就好了。时间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. day 7-14 数据库完整性约束

    一. 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性 主要分为: PRIMARY KEY 标示该字段为表的主键,可以唯一的标示记录 FOREIGN KEY 标示该 ...

  2. Redis的java客户端jedis

    导包:Jedis需要的jar包 >Commons-pool-1.6.jar >Jedis-2.1.0.jar 配置:linux防火墙设置,不会设置就关闭. 停止防火墙 systemctl ...

  3. Golang的select多路复用以及channel使用实践

    看到有个例子实现了一个类似于核弹发射装置,在发射之前还是需要随时能输入终止发射. 这里就可以用到cahnnel 配合select 实现多路复用. select的写法用法有点像switch.但是和swi ...

  4. 对C#调用C++的dll的一点思考

    最近在对接C++程序的时候碰到了一些问题,然后花了一段时间才解决,今天就这些小问题来做一个总结,很多时候由于对另外一种开发语言的不熟悉,会在使用的过程中遇到很多的问题,这些问题看似简单但是背后却有很多 ...

  5. ubuntu 完全卸载mysql

    卸载 sudo apt-get --purge remove mysql-common -y sudo apt-get --purge remove mysql* -y sudo apt-get au ...

  6. 一、kubeadm安装

    一.官网 https://kubernetes.io/zh/docs/setup/independent/install-kubeadm/ 阿里云 kubernetes yum 仓库镜像 安装kube ...

  7. tomcat 和jboss区别

    参考http://blog.csdn.net/sz_bdqn/article/details/6762175

  8. Lodop获取全部JS代码,传统JS模版的生成

    Lodop模版有两种方法,一种是传统的JS语句,可以用JS方法里的eval来执行,一种是文档式模版,是特殊格式的base64码,此篇博文介绍传统JS模版的生成方法.两种模版都可以存入一下地方进行调用, ...

  9. ES 6 系列 - 赋值的新方式:解构赋值

    变量的解构赋值 es 6 允许按照一定的模式,从数组和对象中提取值,然后对变量进行赋值,这被称之为解构: 一.数组的解构赋值 最基本写法: let [a, b, c] = [1, 2, 3]; a / ...

  10. a标签实现锚点功能

    a标签实现锚点功能 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...