题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2457

Description
Sherry现在碰到了一个棘手的问题,有N个整数需要排序。
Sherry手头能用的工具就是若干个双端队列。
她需要依次处理这N个数,对于每个数,Sherry能做以下两件事:
1.新建一个双端队列,并将当前数作为这个队列中的唯一的数;
2.将当前数放入已有的队列的头之前或者尾之后。
对所有的数处理完成之后,Sherry将这些队列排序后就可以得到一个非降的序列。

Input
第一行包含一个整数N,表示整数的个数。接下来的N行每行包含一个整数Di,其中Di表示所需处理的整数。

Output
其中只包含一行,为Sherry最少需要的双端队列数。

Sample Input

6

3

6

0

9

6

3

Sample Output

2

HINT
100%的数据中N≤200000。

题解:

假设原序列 $D$ 排序后的序列为 $E$。换句话说,我们就是要将 $E$ 分成若干段,每一段对应原来的一个双端队列。

现在考虑如何切割 $E$,假设现在我们分割出了其中某一段 $S_1 \sim S_n$,那么其中必然有一个数 $S_k(1 \le k \le n)$ 是第一个进入队列的。

那么 $S_1 \sim S_{k-1}$ 这些数在 $D$ 中的出现顺序必须是降序的。换句话说,在 $S_1 \sim S_{k-1}$ 中,$S_1$ 必须是最后一个在 $D$ 中出现的。这是很显然的,它作为最小的,显然必须最后一个push进双端队列的队首。

同样的道理,$S_{k+1} \sim S_n$ 这些数在 $D$ 中的出现顺序必须是升序的。$S_n$ 它作为最大的一个,必须最后一个push进双端队列的队尾。

也就是说,在 $E$ 中尽可能少地分割出若干段,每段都满足其内部的数在 $D$ 中的出现顺序是先降后升的。这个可以用贪心策略求最少段数。

另外要考虑的一个问题是,同一个数可能在 $D$ 中不同位置出现,那么我们应当让他们在 $E$ 中有一个合适的顺序,使得分割产生的段数尽量少。这个可以做个分类讨论。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int maxn=2e5+; int n;
pii a[maxn]; int tot;
pii bnd[maxn]; int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>a[i].first;
a[i].second=i;
}
sort(a+,a+n+); tot=;
for(int i=;i<=n;i++)
{
//printf("val=%d pos=%d\n",a[i].first,a[i].second);
if(i== || a[i].first!=a[i-].first)
{
bnd[tot].second=a[i-].second;
bnd[++tot].first=a[i].second;
}
}
bnd[tot].second=a[n].second;
//for(int i=1;i<=tot;i++) printf("[%d,%d]\n",bnd[i].first,bnd[i].second); int ans=, pre=maxn, up=;
for(int i=;i<=tot;i++)
{
if(up)
{
if(pre<bnd[i].first) pre=bnd[i].second;
else pre=bnd[i].first, up=, ans++;
}
else
{
if(pre>bnd[i].second) pre=bnd[i].first;
else pre=bnd[i].second, up=;
}
}
cout<<ans<<endl;
}

BZOJ 2457 - 双端队列 - [思维题]的更多相关文章

  1. BZOJ 2457 双端队列(思维

    2457: [BeiJing2011]双端队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 582  Solved: 253[Submit][Sta ...

  2. BZOJ 2457 双端队列

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

  3. BZOJ 2457 [BeiJing2011] 双端队列

    2457: [BeiJing2011]双端队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 340  Solved: 167[Submit][Sta ...

  4. 【贪心】Bzoj 2457:[BeiJing2011]双端队列

    2457: [BeiJing2011]双端队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 209  Solved: 95[Submit][Stat ...

  5. bzoj 2457 [BeiJing2011]双端队列 模拟+贪心

    [BeiJing2011]双端队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 457  Solved: 203[Submit][Status][D ...

  6. 2457: [BeiJing2011]双端队列

    2457: [BeiJing2011]双端队列 链接 很奇妙的转化. 题目要求最后的所有序列也是有序的,所以可以求出最后的序列(即排序后的序列),然后分成许多份,要求每一份都是一个双端序列,求最少分成 ...

  7. C#LeetCode刷题之#641-设计循环双端队列(Design Circular Deque)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4132 访问. 设计实现双端队列. 你的实现需要支持以下操作: M ...

  8. bzoj2457 双端队列

    虽然分类在数据结构里,但是实际上是个贪心题...... 我自己一开始想到了一个错误的贪心.后来发现对于相等值的处理不行. 有个很神的转化,就是把排好序的队列以及对应的原下标都给搞出来. 然后考虑其中一 ...

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

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

随机推荐

  1. JavaScript绑定this

    问题描述 var a = { one: 1, haha() { console.log(this.one) } } setTimeout(a.haha, 1000) 在上例中,函数haha引用了thi ...

  2. linux popen()与system()的区别

    linux popen()与system()的区别 popen() 可以在调用程序和POSIX shell /usr/bin/sh 要执行的命令之间创建一个管道(请参阅sh-posix(1) ). p ...

  3. Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...

  4. dd测试硬盘性能

    下面直接介绍几种常见的DD命令,先看一下他的区别~ dd bs=64k count=4k if=/dev/zero of=testdd bs=64k count=4k if=/dev/zero of= ...

  5. /Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo: No such file or direc

    /Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo: No such file or direc     版权声明:本文为博主 ...

  6. lua -- 生成协议

    这是爬塔的协议 <?xml version="1.0" encoding="utf-8" ?> <coder name="Tower ...

  7. 【原】使用Tkinter绘制GUI并结合Matplotlib实现交互式绘图

    在数据分析的过程中,往往需要对所建立的模型进行可视化,并调整其中的某些参数. 通常情况下,在Python中可以通过Matplotlib来进行绘制图像.然而该绘制过程是静态的,也就是每次调整完参数需要重 ...

  8. Java编程的逻辑 (81) - 并发同步协作工具

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  9. 系统垃圾清理利器CCleaner v5.30.6063绿色单文件版(增强版)

    系统垃圾清理利器CCleaner现已更新至v5.30.6063,此次更新为Edge.IE浏览器提供了更好的清理功能,更新了Windows Explorer MRU清理功能,同时改善了应用程序中的SSD ...

  10. Java知多少(45)未被捕获的异常

    在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式. class Exc0 { public static void ma ...