hdu3415单调队列
题意:
给你一个数字组成的环,要求在里面找到一个最大的子序列,使得和最大,要求:
(1)子序列长度不能超过k
(2)如果子序列和相同要起点最小的
(3)如果起点相同要长度最小的
思路:
首先环我们可以把序列放大一倍,然后Ans = maxx(sum[j] - sum[i]); 其中j>i,j-i>=k,sum[i]是前缀和,对于每一个j我们只要找到前面最小的那个sum[i]就行了,这样就变成了一个比较裸的一个单调队列的题目,求最小我们的队列可以使递增的,每次从队尾进,把比当前大的出队(不是大于等于,是大的,这样保证同样和的时候前缀最小),队头的话只要把距离当前值距离大于k的出队就行了,还有就是记住一点,每次都是先询问在进队,那么在询问之前一定要判断下队头的id是否过期,也就是队头是否要出先队列,这个地方大一了wa了一发。
#include<stdio.h>
#include<string.h>
#define N 200000 + 10
typedef struct
{
int id ,num;
}NODE;
NODE Q[N];
int num[N];
int tou ,wei ,k;
void insert(int id ,int num)
{
for(int i = wei ;i > tou ;i --)
if(Q[i].num > num) wei --;
else break;
Q[++wei].id = id;
Q[wei].num = num;
for(int i = tou + 1 ;i <= wei ;i ++)
if(id - Q[i].id > k) tou ++;
else break;
}
int main ()
{
int t ,n ,j ,i;
int Ansa ,Ansb ,Ansc;
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&n ,&k);
for(i = 1 ;i <= n ;i ++)
{
scanf("%d" ,&num[i]);
num[i+n] = num[i];
}
Ansc = - 1000000000;
tou = wei = 0;
int sum = 0;
Q[++wei].num = 0;
Q[wei].id = 0;
num[0] = 0;
for(i = 1 ;i <= n + n ;i ++)
{
sum += num[i];
while(i - Q[tou+1].id > k)
tou ++;
int now = sum - Q[tou+1].num;
if(now > Ansc)
Ansc = now ,Ansa = Q[tou+1].id + 1,Ansb = i;
insert(i ,sum);
}
if(Ansb > n) Ansb -= n;
printf("%d %d %d\n" ,Ansc ,Ansa ,Ansb);
}
return 0;
}
hdu3415单调队列相关推荐
- hdu3415 单调队列模板题
比较裸的单调队列 先求前缀和,枚举所有结束位置1~n+k即可 #include<iostream> #include<cstdio> #include<cstring&g ...
- 单调队列多重背包时间复杂度O(vn)
版权声明:本文为博主原创文章,未经博主允许不得转载. 多重背包问题: 有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件.怎样装才能使背包内的物品总价值最大? 网 ...
- 洛谷 P2219修筑绿化带 二维单调队列~
题目链接:https://www.luogu.org/problem/P2219 emmm调了一个上午+中午,fan 题意:从N*M的中找到一个a*b的大矩形和减去a*b中的一个与之不重边界的c*d的 ...
- P2216 理想的正方形 单调队列 (二维)
题目链接:https://www.luogu.org/problem/P2216 题意:求给定n*m的矩形中所有k*k的正方形块中最大值最小值之差(极差)最小 哇,大神的思路真的很帅 单调队列对每一行 ...
- 点分治问题 ----------- luoguP2942 [WC2010]重建计划 [点分治 + bfs + 单调队列 + 预处理建树 + 二分 + 01分数规划]
题目链接 解题思路: 1.对于这个Avgvalue=∑e∈sv(e)∣s∣Avgvalue = \frac{\sum_{e\in s}v(e)}{|s|}Avgvalue=∣s∣∑e∈sv(e) ...
- 解题报告:Fake Maxpooling(单调队列求矩阵的和)
我们不妨先把这个问题中二维的矩阵简化成一维的数列.那么现在的问题就变成了一个求连续的滑动窗口最值问题:给出一个长度为n的数列和一个长度为k(k<n)的窗口,记录滑动窗口位于每个位置下的下的最大值 ...
- 0x12.基本数据结构 — 队列与单调队列
目录 一.队列 0.UVA540 团体队列 Team Queue 1.AcWing 133. 蚯蚓(模拟优先队列) 二 .单调队列 0.AcWing 135. 最大子序和(单调队列) 1.luogu ...
- 【题解】P1419 寻找段落(二分+单调队列)难度⭐⭐⭐★
P1419 寻找段落 首先二分答案,即:二分最大平均值. 我们将a全部减去mid,问题转化为判断是否存在一个长度在s~t范围内的区间它的和为正,如果有说明还有更大的平均值. 用前缀和和单调队列维护. ...
- 【数据结构】单调栈和单调队列 详解+例题剖析
算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...
最新文章
- Python中的三目运算符------if else 同行
- 《Generative Face Completion》论文笔记
- 解决thymeleaf报错 $ is not defined
- c++ 或者 vc++中判断程序实例是否运行
- linux7有相当于wget的,centos7安装mwget下载资源,提升下载速度
- Flask框架flash消息闪现学习与优化符合闪现之名
- Java-计算程序运行时间
- 多帧点云数据拼接合并_点云拼接
- Codeforces1388 D. Captain Flint and Treasure(贪心)
- NEFU 1266 快乐的雨季 (线段树)
- 强化学习——蒙特卡洛方法
- 干货:esp32彩屏自制太空人主题透明手表!
- java nas smb_FreeNAS 02:深入 SMB 服务使用
- 自定义钉钉机器人发消息@所有人
- 【BDTC 2017】专访中兴通讯杜学军:uSmartInsight,大数据与人工智能融合平台
- 2020美赛D题原文及翻译
- 使用keras-bert进行中文文本分类+Google colab运行源码
- Ner-Ocr识别文本格式化问题
- 操作系统之多道批处理,分时,实时系统
- R3DS Wrap基本使用方法