BZOJ 2457 [BeiJing2011] 双端队列
2457: [BeiJing2011]双端队列
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 340 Solved: 167
[Submit][Status][Discuss]
Description
Input
Output
其中只包含一行,为Sherry最少需要的双端队列数。
Sample Input
Sample Output
HINT
100%的数据中N≤200000。
题解:
此题手玩了很久,发现了一个对于不重复的元素可行的nlogn的方法。首先给每一个元素编号1~n,然后放在结构体里面sort。例如样例:
IN:6 1 8 7 4 2 6 OUT:3
序号变成了1 5 4 6 3 2。可以发现首先对于1号,左右都没有已经加入队列的元素,那么新建一个ans=1。对于2,新建一个ans=2。对于3,右边有2了,就把3加入到2,ans=2。对于4,新建一个,ans=3。对于5加入到1和4都可以,对于6,加入到4和3都可以。这个可以使用并查集轻松实现。但是题目中的是有重复的。
我们想,对于排好序的元素,每一个单调队列一定都是从中截取连续的一段作为自己的元素的,那么我们观察一下他的序号。例如样例,第一个队列中元素的序号为3 1 6,第二个为5 2 4。题目要求依次考虑,那么初始的元素必定序号最小,然后它左右两边的序号都要比它大,所以这是一个元素单调,元素的序号呈中间小,两边大的单调队列。特别的,序号递增或递减(左边没有元素或右边没有元素)。那么怎么求呢?
第一种不重复元素的方法遇到重复的元素就没有办法了,但是发现了序号的规律之后,我们对于重复的元素,就可以合并了,然后记下相同元素所对应的序号最大与序号最小值即可。当前面一个元素(合并之后,元素是无相同的了)是递增的,那么当前这一个元素如果没有办法继续递增,就要新建一个单调队列了。前面元素递减同理。
不存在一种情况使得相同的元素在不同的单调队列。因为队列起始元素自然递减更优,限制递减状态改为递增的是最小值,把相同元素放在不同的队列,并不能把最小的放过去,还不如放在一起。
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register
#define LL long long
#define fre(a) freopen(a".in","r",stdin);//freopen(a".out","w",stdout);
using namespace std;
const int MAXN=;
int n,now,down,up,ans,top;
int mx[MAXN],mi[MAXN];
struct ed
{
int v,id;
}a[MAXN];
bool comp(ed x,ed y)
{
if(x.v!=y.v)
return x.v<y.v;
return x.id<y.id;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i].v);
a[i].id=i;
}
sort(a+,a+n+,comp);
top++; mi[top]=mx[top]=a[].id;
for(int i=;i<=n;i++)
{
if(a[i].v!=a[i-].v)
top++ , mi[top]=a[i].id;
if(a[i].v!=a[i+].v)
mx[top]=a[i].id;
}
now=mi[]; down=; up=;
for(int i=;i<=top;i++)
{
if(up)//一个断点
{
if(mi[i]<now)
{ ans++; up=; down=; now=mi[i]; }
else
now=mx[i];
}
else if(down)
{
if(mx[i]<now)
now=mi[i];
else
up=,now=mx[i];
}
}
printf("%d\n",ans+);
return ;
}
BZOJ 2457 [BeiJing2011] 双端队列的更多相关文章
- 【贪心】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]双端队列 链接 很奇妙的转化. 题目要求最后的所有序列也是有序的,所以可以求出最后的序列(即排序后的序列),然后分成许多份,要求每一份都是一个双端序列,求最少分成 ...
- 【BZOJ 2457】 双端队列
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2457 [算法] 贪心 [代码] #include<bits/stdc++.h& ...
- 【BZOJ2457】[BeiJing2011]双端队列 贪心+模拟
[BZOJ2457][BeiJing2011]双端队列 Description Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若 ...
- BZOJ2457 BeiJing2011 双端队列
[问题描述] Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事 ...
- [BZOJ2457][BeiJing2011]双端队列 (单调性)
正如lyd所说,和数据结构本身没什么太大关联 题意 中文题面 Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. ...
- BZOJ2457 [BeiJing2011]双端队列 【贪心】
题目 Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事: 1.新建一个双端队列 ...
- BZOJ 2457 双端队列(思维
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 582 Solved: 253[Submit][Sta ...
随机推荐
- weex 小结
1. import 文件时,必须引入全称,不能省略 .vue import mEcharts from '../components/Echarts.vue' 2.weex 的 cli 中没有 配置 ...
- leetcode 刷题之路 68 Gas Station
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- FlashBuilder找不到所需要的AdobeFlashPlayer调试器版本的解决方案
这个问题就是因为你所装的FlashPlayer不是调试器版本.如果你的FlashPlayer是调试版,那么你随便打开一个有Flash的页面,然后右键点击Flash,就会有一个调试器,菜单,当然它现在是 ...
- Intel processor brand names-Xeon,Core,Pentium,Celeron----Pentium
http://en.wikipedia.org/wiki/Pentium Pentium From Wikipedia, the free encyclopedia This article ...
- C++ Primer 学习笔记与思考_7 void和void*指针的使用方法
(一)void的含义 void的字面意思是"无类型",void差点儿仅仅有"凝视"和限制程序的作用,由于从来没有人会定义一个void变量,让我们试着来定义: v ...
- 基于bootstrap_网站汇总页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- WebSocket 和 Socket 的区别
WebSocket 和 Socket 的区别 英文:TheAlchemist 链接:http://www.jianshu.com/p/59b5594ffbb0 <刨根问底 HTTP 和 We ...
- 全志Android SDK编译详解(一)
1.编译环境说明 Linux 服务器(任意电脑都可以,建议选择配置高的)安装ubuntu 10.04 作为编译的主机,其他开发者在xp 下,通过SSH/Telent 等协议登录linux 主机进行编. ...
- dsp端编译异常之max和min未定义
(1)在函数之前 声明__stdcall 时 在linux 端或dsp端 linux 之前的加上宏定义 __stdcall是MS的编译器使用的只需要#define __stdcall定义一个宏就可以 ...
- cocos2d-x(vs2012)环境搭建(第一篇)[版本号:cocos2d-x-3.1.1]
1.下载资源 下载cocos2d-x包V3.1.1,下载戳这里: http://www.cocos2d-x.org/download vs2012下载戳这里: http://www.xiazaiba. ...