bzoj 2457 [BeiJing2011]双端队列 模拟+贪心
[BeiJing2011]双端队列
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 457 Solved: 203
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
3
6
0
9
6
3
Sample Output
HINT
100%的数据中N≤200000。
题解:第一思路很重要:我们将原序列中的所有数排序,然后从小到大一个个扔回原序列中。根据贪心的思想,我们一定是先连续扔一些个,再将这几个放到一个队列中,再连续的扔一些个。。。并且我们每一次扔的数一定是越多越好。
那么我们只需要知道每次扔进去的数需要满足什么条件即可。根据题意,如果令pi表示第i大的数的位置,那么每次扔进去的pi一定是先递减再递增的。所以我们将所有相同的数合并,得到每个数出现的最左边和最右边的位置,然后模拟一发就行了。
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue> #define N 200007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m,tag,pre,ans;
int p[N],v[N],sm[N],sn[N]; bool cmp(int a,int b)
{
return (v[a]==v[b])?(a<b):(v[a]<v[b]);
}
int main()
{
n=read();
for(int i=;i<=n;i++)
v[i]=read(),p[i]=i;v[]=-;
sort(p+,p+n+,cmp);
for(int i=;i<=n;i++)
{
if(v[p[i]]!=v[p[i-]]) m++,sm[m]=sn[m]=p[i];
sm[m]=max(sm[m],p[i]),sn[m]=min(sn[m],p[i]);
}
for(int i=;i<=m;i++)
{
if(i==||(tag&&sn[i]<pre)) ans++,tag=,pre=sn[i];
else if(!tag&&sm[i]>pre) tag=,pre=sm[i];
else if(!tag&&sm[i]<pre) pre=sn[i];
else if(tag&&sn[i]>pre) pre=sm[i];
}
printf("%d",ans);
}
bzoj 2457 [BeiJing2011]双端队列 模拟+贪心的更多相关文章
- 【贪心】Bzoj 2457:[BeiJing2011]双端队列
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 209 Solved: 95[Submit][Stat ...
- BZOJ 2457 [BeiJing2011] 双端队列
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 340 Solved: 167[Submit][Sta ...
- 2457: [BeiJing2011]双端队列
2457: [BeiJing2011]双端队列 链接 很奇妙的转化. 题目要求最后的所有序列也是有序的,所以可以求出最后的序列(即排序后的序列),然后分成许多份,要求每一份都是一个双端序列,求最少分成 ...
- BZOJ2457 [BeiJing2011]双端队列 【贪心】
题目 Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事: 1.新建一个双端队列 ...
- 【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能做以下两件事 ...
- hdu-5929 Basic Data Structure(双端队列+模拟)
题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- UVa 210 Concurrency Simulator (双端队列+模拟)
题意:给定n个程序,每种程序有五种操作,分别为 var = constant(赋值),print var (打印), lock, unlock,end. 变量用小写字母表示,初始化为0,为程序所公有( ...
随机推荐
- IntelliJ IDEA 2018 for MAC安装及破解
---------------------说在前面-------------------------- IntelliJ IDEA 2018 版本为2018.1.4 教程按照下载安装sdk.破解两部分 ...
- 三:QJM HDFS高可用
本文介绍的是HDFS的一种HA方案.虽然有checkpoint node \backup node等,但是不能实现自动的failover. http://hadoop.apache.org/docs/ ...
- 一起写一个Android图片轮播控件
注:本文提到的Android轮播控件Demo地址: Android图片轮播控件 1. 轮播控件的组成部分 我们以知乎日报Android客户端的轮播控件为例,分析一下轮播控件的主要组成: 首先我们要有用 ...
- 通过access_token openid获取微信用户昵称等信息
<?php header('Access-Control-Allow-Origin:*'); $access_token = !empty($_GET['access_token'])?$_GE ...
- Linux less命令语法
一.Linux less命令语法 less [参数] 文件 less命令非常强大,在此只介绍几个常用的参数,更多参数使用man less来查看Linux帮助手册. -b <缓冲区大小> 设 ...
- MVP开发模式的理解
1.MVP是什么 如果从层次关系来讲,MVP属于Presentation层的设计模式.对于一个UI模块来说,它的所有功能被分割为三个部分,分别通过Model.View和Presenter来承载.Mod ...
- WebKit 源码分析 -- loader
原文地址: http://peirenlei.iteye.com/blog/1718569 摘要:本文介绍 WebCore 中 Loader 模块是如何加载资源的,分主资源和派生资源分析 loader ...
- java 基础 --集合--012
1, 数组与集合 A:长度不同 数组的长度固定,集合的长度可变 B:内容不同 数组里存储的是同一种类型的元素,而集合可以存储不同类型的元素 C:元素的数据类型问题 数组可以存储基本数据类型,也可以存储 ...
- tcp发送缓冲区中的数据都是由产生数据的进程给推送到ip层还是有定时任务触发?
和几个变量有非常大的关系 发送缓冲区的大小,如何单独设置一个socket的发送缓冲区 socketopt 发送缓冲区中的数据,如果被拥塞窗口限制住了,那么这些数据可能就放在tcpbuffer里的,此时 ...
- delphi dbgrid 批量保存
unit uzcdbadd; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fo ...