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

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

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

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

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

所以特判一下就好了。时间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. linux audit审计(4)--audit的日志切分,以及与rsyslog的切分协同使用

    audit的规则配置稍微不当,就会短时间内产生大量日志,所以这个规则配置一定要当心.当audit日志写满后,可以看到如下场景: -r-------- 1 root root 8388609 Mar 3 ...

  2. WPF中元素拖拽的两个实例

    今天结合之前做过的一些拖拽的例子来对这个方面进行一些总结,这里主要用两个例子来说明在WPF中如何使用拖拽进行操作,元素拖拽是一个常见的操作,第一个拖拽的例子是将ListBox中的子元素拖拽到ListV ...

  3. 如何在集合中巧用Where来查找相关元素

    在我们的项目中我们经常会查找一些集合中的重要元素,当然我们可以使用常规的foreach循环和if语句来查询,但是我们要学会使用System.Linq命名空间下面的静态类Enumerable下面的静态方 ...

  4. Python:matplotlib绘制线条图

    线型图是学习matplotlib绘图的最基础案例.我们来看看具体过程:  下面我们将两条曲线绘制到一个图形里:   可以看到这种方式下,两个线条共用一个坐标轴,并且自动区分颜色. plot方法的核心是 ...

  5. 设计模式笔记:单一职责原则(SRP, Single Responsibility Principle)

    1. 单一职责原则核心思想 一个类应该有且只有一个变化的原因. 2. 为什么引入单一职责原则 单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化的中心. 在SRP中,把职责定义为变化的原因 ...

  6. vue.js2.0:如何搭建开发环境及构建项目

    1,安装node.js Node.js官网:https://nodejs.org/en/ 进入Node.js官网,选择下载并安装Node.js.安装过程只需要点击“下一步”即可, 如下图,非常简单. ...

  7. python好文章

    http://blog.csdn.net/csdnnews/article/details/78557392

  8. 学习 Spring (十四) Introduction

    Spring入门篇 学习笔记 Introduction 允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象 由 中的 元素声明该元素用于声明所匹配的类型拥有一个新的 p ...

  9. Mysql(Mariadb)数据库主从复制

    Mysql主从复制的实现原理图大致如下: MySQL之间数据复制的基础是以二进制日志文件(binary log file)来实现的,一台MySQL数据库一旦启用二进制日志后,其作为master,它数据 ...

  10. Javascript和Jquery语法对比总结

    目的 相信大家都知道jq是js的一个类库,是为了方便我们开发前端,但是笔者在刚开始学习js和jq时经常将两者的语法记混和混用,所以整理下两者实现相同功能之前的语法区别. 声明变量 javascript ...