【BZOJ2457】[BeiJing2011]双端队列 贪心+模拟
【BZOJ2457】[BeiJing2011]双端队列
Description
Input
Output
Sample Input
3
6
0
9
6
3
Sample Output
HINT
100%的数据中N≤200000。
题解:第一思路很重要:我们将原序列中的所有数排序,然后从小到大一个个扔回原序列中。根据贪心的思想,我们一定是先连续扔一些个,再将这几个放到一个队列中,再连续的扔一些个。。。并且我们每一次扔的数一定是越多越好。
那么我们只需要知道每次扔进去的数需要满足什么条件即可。根据题意,如果令pi表示第i大的数的位置,那么每次扔进去的pi一定是先递减再递增的。所以我们将所有相同的数合并,得到每个数出现的最左边和最右边的位置,然后模拟一发就行了。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=200010;
int n,m,tag,pre,ans;
int p[maxn],v[maxn],sm[maxn],sn[maxn];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
bool cmp(int a,int b)
{
return (v[a]==v[b])?(a<b):(v[a]<v[b]);
}
int main()
{
n=rd();
int i;
for(i=1;i<=n;i++) v[i]=rd(),p[i]=i;
sort(p+1,p+n+1,cmp);
for(v[0]=-1,i=1;i<=n;i++)
{
if(v[p[i]]!=v[p[i-1]]) m++,sm[m]=sn[m]=p[i];
sm[m]=max(sm[m],p[i]),sn[m]=min(sn[m],p[i]);
}
for(i=1;i<=m;i++)
{
if(i==1||(tag&&sn[i]<pre)) ans++,tag=0,pre=sn[i];
else if(!tag&&sm[i]>pre) tag=1,pre=sm[i];
else if(!tag&&sm[i]<pre) pre=sn[i];
else if(tag&&sn[i]>pre) pre=sm[i];
}
printf("%d",ans);
return 0;
}
【BZOJ2457】[BeiJing2011]双端队列 贪心+模拟的更多相关文章
- BZOJ2457 [BeiJing2011]双端队列 【贪心】
题目 Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事: 1.新建一个双端队列 ...
- BZOJ2457 BeiJing2011 双端队列
[问题描述] Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事 ...
- [BZOJ2457][BeiJing2011]双端队列 (单调性)
正如lyd所说,和数据结构本身没什么太大关联 题意 中文题面 Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. ...
- bzoj 2457 [BeiJing2011]双端队列 模拟+贪心
[BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 457 Solved: 203[Submit][Status][D ...
- 【贪心】Bzoj 2457:[BeiJing2011]双端队列
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 209 Solved: 95[Submit][Stat ...
- 2457: [BeiJing2011]双端队列
2457: [BeiJing2011]双端队列 链接 很奇妙的转化. 题目要求最后的所有序列也是有序的,所以可以求出最后的序列(即排序后的序列),然后分成许多份,要求每一份都是一个双端序列,求最少分成 ...
- BZOJ 2457 [BeiJing2011] 双端队列
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 340 Solved: 167[Submit][Sta ...
- BZOJ 2457 双端队列(思维
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 582 Solved: 253[Submit][Sta ...
- hdu-5929 Basic Data Structure(双端队列+模拟)
题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
随机推荐
- Ueditor 在线编辑器使用
ueditor在线编辑器插件 地址:http://ueditor.baidu.com/website/ 试用体验: 帮助文档:http://fex.baidu.com/ueditor/ 实操 引入 ...
- Splitting Pile --AtCoder
题目描述 Snuke and Raccoon have a heap of N cards. The i-th card from the top has the integer ai written ...
- 好用的 HTTP模块SuperAgent
SuperAgent 最近在写爬虫,看了下node里面有啥关于ajax的模块,发现superagent这个模块灰常的好用.好东西要和大家分享,话不多说,开始吧- 什么是SuperAgent super ...
- Jenkins集成java非maven/ant项目的打包思路
打包的思路如下: 1.使用javac命令对代码进行编译,比如递归编译整个项目的java代码.(注意:需要一一对应引用的jar包) 2.输出并整理war包的文件夹结构目录,参考:http://www.c ...
- Displaying Modal Window Messages in Oracle Forms Using Show_Alert
You can display modal windows in Oracle Forms to display normal messages, error message or asking fo ...
- vim学习记录(转)
基本功 Vim有三种模式: 导航(navigation)模式. 这时候,字母就是上下左右键. 输入模式.这时候,你按字母键,才会输入字母. 命令模式.需要先输入":" 冒号,才会进 ...
- java wait(),notify(),notifyAll()的理解
这个三个函数来自Object类,众所周知它们是用于多线程同步的.然而,有个问题却一直没搞清楚,即notify()函数到底通知谁?<Thinking in JAVA>中有这么一句话,当not ...
- OpenTSDB设计解读
OpenTSDB是基于HBase存储时间序列数据的一个开源数据库,确切地说,它仅仅是一个HBase的应用而已,其对于时间序列数据的处理能够供其它系统參考和借鉴.本文会针对它在数据库的设计方面展开一些探 ...
- java使用Runtime.exec()运行windwos dos或linux shell命令
使用Runtime.exec()运行windwos dos或linux shell命令,按实际情况具体测试 实例代码: package com.bookoo.test.command; imp ...
- Docker 三大核心工具
Docker-machineDocker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox. Digital Oc ...