BZOJ 2457 - 双端队列 - [思维题]
题目链接: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 - 双端队列 - [思维题]的更多相关文章
- BZOJ 2457 双端队列(思维
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 582 Solved: 253[Submit][Sta ...
- BZOJ 2457 双端队列
Sherry 现在碰到了一个棘手的问题,有N个整数需要排序. Sherry 手头能用的工具就是若干个双端队列. 她需要依次处理这 N 个数,对于每个数, Sh ...
- BZOJ 2457 [BeiJing2011] 双端队列
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 340 Solved: 167[Submit][Sta ...
- 【贪心】Bzoj 2457:[BeiJing2011]双端队列
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 209 Solved: 95[Submit][Stat ...
- bzoj 2457 [BeiJing2011]双端队列 模拟+贪心
[BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 457 Solved: 203[Submit][Status][D ...
- 2457: [BeiJing2011]双端队列
2457: [BeiJing2011]双端队列 链接 很奇妙的转化. 题目要求最后的所有序列也是有序的,所以可以求出最后的序列(即排序后的序列),然后分成许多份,要求每一份都是一个双端序列,求最少分成 ...
- C#LeetCode刷题之#641-设计循环双端队列(Design Circular Deque)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4132 访问. 设计实现双端队列. 你的实现需要支持以下操作: M ...
- bzoj2457 双端队列
虽然分类在数据结构里,但是实际上是个贪心题...... 我自己一开始想到了一个错误的贪心.后来发现对于相等值的处理不行. 有个很神的转化,就是把排好序的队列以及对应的原下标都给搞出来. 然后考虑其中一 ...
- lintcode 滑动窗口的最大值(双端队列)
题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为 ...
随机推荐
- Hadoop2.2.0分布式安装配置详解[1/3]
前言 在寒假前的一段时间,开始调研Hadoop2.2.0搭建过程,当时苦于没有机器,只是在3台笔记本上,简单跑通一些数据.一转眼一两个月过去了,有些东西对已经忘了.现在实验室申请下来了,分了10台机器 ...
- Spark 核心篇-SparkEnv
本章内容: 1.功能概述 SparkEnv是Spark的执行环境对象,其中包括与众多Executor执行相关的对象.Spark 对任务的计算都依托于 Executor 的能力,所有的 Executor ...
- css table样式
1.table样式首先设置表格边框,属性设置表格的边框是否被合并为一个单一的边框. table{ border-collapse: collapse; border-spacing: 0;} 2.固定 ...
- Atitit 项目文档规范化与必备文档与推荐文档列表
Atitit 项目文档规范化与必备文档与推荐文档列表 ===========比较重要的必备文档========== 项目组名单通讯录( 包括项目组,客户沟通人等 需求文档 原型ui文档 开发计划表 项 ...
- android sdk manager 代理设置
启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - Settings』窗口: 在『Andro ...
- Android开发(十九)——ViewFlipper中的onClick事件和onFling事件冲突
在onDown中设置this.flipper.setClickable(true); 然后在onFling方法中this.flipper.setClickable(false); ps: 其中setO ...
- Odoo小数精度及货币精度详解
一.小数精度的设置 一般在设置-数据结构-精度设置中就可以对 小数类型的字段进行精度设置: 对于代码中定义为 digits=dp.get_precision('Product Price') 或 di ...
- OAuth 2.0 C# 版
using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using Syste ...
- c++ linux socket编程 c++网络编程
声明:大部分代码来自这篇博客http://www.cnblogs.com/diligenceday/p/6241021.html, 感谢博主 思路: 思路很重要呦~~~ socket详细信息,思路:h ...
- JVM学习(3)——总结Java内存模型---转载自http://www.cnblogs.com/kubixuesheng/p/5202556.html
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...