单调队列练习题(oj p1157 p1158 p1159)
p1157是很气人的...自从评测机挂了后,速度就特别慢,cin已经过不了了,然而我不知道,就各种**的提交

惨兮兮惨兮兮,这还是开了小号(通过率堪忧.jpg...)...

思路就是单调队列维护,用队列存储k个数中最小数下标......还是代码加注释好懂
#include <bits/stdc++.h>
using namespace std;
int n,k;
int qm[1000006],tail=1,head=1;
int a[1000006];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
qm[head]=1;
for(int i=2;i<=k;i++)
{
while(a[i]<a[qm[tail]]&&tail>=head)//维护单调递减,在k个数内,如果当前元素有小于队尾元素(队列中下标对应原数组中的数)
tail--;//出队
qm[++tail]=i;//入队
}
for(int i=k;i<=n;i++)
{
if(i-qm[head]==k)//如果i-队头元素下标==k,证明该换最小值了,就head++;
head++;
while(a[i]<a[qm[tail]]&&tail>=head)//同上
tail--;
qm[++tail]=i;
cout<<a[qm[head]]<<' ';
}
cout<<endl;
head=1;tail=1;
qm[head]=1;
for(int i=2;i<=k;i++)//同上,以下维护单调递增
{
while(a[i]>a[qm[tail]]&&tail>=head)
tail--;
qm[++tail]=i;
}
for(int i=k;i<=n;i++)
{
if(i-qm[head]==k)
head++;
while(a[i]>a[qm[tail]]&&tail>=head)
tail--;
qm[++tail]=i;
cout<<a[qm[head]]<<' ';
}
return 0;
}
P1158
合并果子

往年的一道noip题,思路还行...然而我被卡了差不多2天,本来想的思路对的,不知道怎么就想偏了。
总之就是没回从队中抽出最小的两个相加,出队,再将他们的和进队。说实话,如果不用STL,差不多就是一次一排序?或是二重?反正我没想出来....STL优先队列就很方便了
设一个小的优先级的队列,将最小的两个出队,在将他们的和进队。因为是n堆果子合并,所以实际只需合并n-1次
#include <bits/stdc++.h>
using namespace std;
struct cmp1
{
bool operator ()(int x, int y)
{
return x > y;//小的优先级高
}
};
priority_queue<int,vector<int>,cmp1>q;
int n,a,ans=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
q.push(a);
}
for(int i=1;i<=n-1;i++)
{
int x,y;
x=q.top();
q.pop();
y=q.top();
q.pop();
q.push(x+y);
ans+=x+y;
}
cout<<ans<<endl;
return 0;
}
P1159 假日
usaco原题。。。感觉我现在想不到算法,决定学完dp再回来补敲
单调队列练习题(oj p1157 p1158 p1159)的更多相关文章
- 【POJ 2823 Sliding Window】 单调队列
题目大意:给n个数,一个长度为k(k<n)的闭区间从0滑动到n,求滑动中区间的最大值序列和最小值序列. 最大值和最小值是类似的,在此以最大值为例分析. 数据结构要求:能保存最多k个元素,快速取得 ...
- 2018.10.14 bzoj1915: 奶牛的跳格子游戏(单调队列优化dp)
传送门 NOIP练习题. f[i]f[i]f[i]表示去的时候选了iii且回来的时候第一步走的是i−1i-1i−1的最优值. 显然f[i]=maxf[i]=maxf[i]=max{f[j]−sum[j ...
- zstu 4237 马里奥的求救——(单调队列DP)
题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4237 这题可以转化为每次可以走g~d+x步,求最大分数,且最大分数的步数最少. ...
- Codeforces - 1195E - OpenStreetMap - 单调队列
https://codeforc.es/contest/1195/problem/E 一个能运行但是会T的版本,因为本质上还是\(O(nmab)\)的算法.每次\(O(ab)\)初始化矩阵中的可能有用 ...
- 单调队列练习题解(切蛋糕&好消息,坏消息)
单调队列的练习题解 前言: 在上一篇学习记录中,单调队列给出了几道练习题,因为这两道题的算法以及思路相差无几(几乎可以算是双倍经验quq),所以就在这里集中写一下相关的题解 前置知识: 见:队列专题( ...
- Sliding Window - 题解【单调队列】
题面: An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving fr ...
- BestCoder Round #89 B题---Fxx and game(单调队列)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945 问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路: B ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
随机推荐
- 【题解】JLOI2015战争调度
搜索+状压+DP. 注意到一个性质:考虑一棵以x为根的子树,在x到原树的根的路径上的点如果都已经确定了方案,那么x的左右儿子的决策就彼此独立,互不影响了.所以我们考虑状压一条路径上每一层节点的状态,求 ...
- CentOS 6.4安装配置ldap
CentOS 6.5安装配置ldap 时间:2015-07-14 00:54来源:blog.51cto.com 作者:"ly36843运维" 博客 举报 点击:274次 一.安装l ...
- tcp/ip网络协议学习
链路层介绍 网络层协议的数据单元是 IP 数据报 ,而数据链路层的工作就是把网络层交下来的 IP 数据报 封装为 帧(frame)发送到链路上,以及把接收到的帧中的数据取出并上交给网络层. 以太网 以 ...
- TOM的show_space
show_space查看对像数据块的空闲情况 CREATE OR REPLACE PROCEDURE show_space(p_segname IN VARCHAR2, p_owner IN VARC ...
- 浅析 nth-child(n) 和 nth-of-type(n)
首先看一个例子 <div> <p>第一个段落</p> <p>第二个段落</p> </div> p:nth-child(2) { ...
- 转:极小极大搜索方法、负值最大算法和Alpha-Beta搜索方法
转自:极小极大搜索方法.负值最大算法和Alpha-Beta搜索方法 1. 极小极大搜索方法 一般应用在博弈搜索中,比如:围棋,五子棋,象棋等.结果有三种可能:胜利.失败和平局.暴力搜索,如果想通 ...
- java封装的使用
一:前言 其实以前我们来学习java特性的时候,对于封装好想觉得没什么用处,至少我那个时候的感觉(不知道是不是我学的太浅薄了~),现在由于项目从零开始做得,在做得过程中我感觉到原来封装是这样用的. 二 ...
- 一维和二维ST模板
void init(){ ; i < n; i++) st[i][] = a[i]; ; ( << j) <= n; j++){ ; i + ( << j) - & ...
- 51nod数字1的数量
这道题瞎jbyy了很久 方法可能很奇怪... #include<cstdio> #include<cstring> #include<algorithm> #inc ...
- 【洛谷 P4886】 快递员 (点分治)
这题因为一些小细节还是\(debug\)了很久...不过我第一次用脚本对拍,不亏. 先随便找一个点作为根,算出答案,即所有点对到这个点的距离和的最大值,并记录所有距离最大的点对.如果这个点在任意一个距 ...