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

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

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

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

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

所以特判一下就好了。时间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. 【学亮开讲】Oracle内外连接查询20181119

    --内连接查询 --需求:查询显示业主编号.业主名称.业主类型名称 select os.id 业主编号,os.name 业主名称,ot.name 业主类型名称 from t_owners os,t_o ...

  2. ArrayList性能短板深入分析

    ArrayList的数据结构主体是Object[]数组,数组对象在内存的位置是成块成块的. 1.对数组进行非尾部修改,会引发System.arrayCopy()行为.这就需要对后半部要移动的对象进行内 ...

  3. java中解决小数精度问题

    public class TestDouble { public static void main(String[] args) { Double d1 = 0.1; Double d2 = 0.2; ...

  4. websocket协议握手详解

    最近使用tornado做长链接想着怎么着也要试试websocket协议吧.所以说干就干. 首先要知道websocket是基于http协议的,为什么这么说?因为从协议来说,websocket是借用了一部 ...

  5. drf图片字段序列化完整路径

    一.需求 前端需要它想要的数据格式: 原有的数据格式: 二.定制化: 1.可以嵌套序列化pol_type,lit_des,area_detail,但结构如下: class ChrDetailSeria ...

  6. 如何通过stat获取目录或文件的权限的数字形式

    man stat 查看帮助. -c --format=FORMAT use the specified FORMAT instead of the default; output a new line ...

  7. swagger bug

    https://blog.csdn.net/u011943534/article/details/81778125 处理swagger报错Could not resolve pointer: /def ...

  8. vuex2.0 基本使用(4) --- modules

    vue 使用的是单一状态树对整个应用的状态进行管理,也就是说,应用中的所有状态都放到store中,如果是一个大型应用,状态非常多, store 就会非常庞大,不太好管理.这时vuex 提供了另外一种方 ...

  9. Jquery实现检测用户输入用户名和密码不能为空

    要求 1.用户名和密码为空点击登录时提示相应的提示 2.获取用户名输入框时,错误提示清除 思路 1.创建1个input-text标签和1个input-password标签,1个input-botton ...

  10. DRF 序列化组件

    Serializers 序列化组件 Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objec ...