题意:
      给你一个数字组成的环,要求在里面找到一个最大的子序列,使得和最大,要求:
(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单调队列相关推荐

  1. hdu3415 单调队列模板题

    比较裸的单调队列 先求前缀和,枚举所有结束位置1~n+k即可 #include<iostream> #include<cstdio> #include<cstring&g ...

  2. 单调队列多重背包时间复杂度O(vn)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 多重背包问题: 有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件.怎样装才能使背包内的物品总价值最大? 网 ...

  3. 洛谷 P2219修筑绿化带 二维单调队列~

    题目链接:https://www.luogu.org/problem/P2219 emmm调了一个上午+中午,fan 题意:从N*M的中找到一个a*b的大矩形和减去a*b中的一个与之不重边界的c*d的 ...

  4. P2216 理想的正方形 单调队列 (二维)

    题目链接:https://www.luogu.org/problem/P2216 题意:求给定n*m的矩形中所有k*k的正方形块中最大值最小值之差(极差)最小 哇,大神的思路真的很帅 单调队列对每一行 ...

  5. 点分治问题 ----------- luoguP2942 [WC2010]重建计划 [点分治 + bfs + 单调队列 + 预处理建树 + 二分 + 01分数规划]

    题目链接 解题思路: 1.对于这个Avgvalue=∑e∈sv(e)∣s∣Avgvalue = \frac{\sum_{e\in s}v(e)}{|s|}Avgvalue=∣s∣∑e∈s​v(e)​ ...

  6. 解题报告:Fake Maxpooling(单调队列求矩阵的和)

    我们不妨先把这个问题中二维的矩阵简化成一维的数列.那么现在的问题就变成了一个求连续的滑动窗口最值问题:给出一个长度为n的数列和一个长度为k(k<n)的窗口,记录滑动窗口位于每个位置下的下的最大值 ...

  7. 0x12.基本数据结构 — 队列与单调队列

    目录 一.队列 0.UVA540 团体队列 Team Queue 1.AcWing 133. 蚯蚓(模拟优先队列) 二 .单调队列 0.AcWing 135. 最大子序和(单调队列) 1.luogu ...

  8. 【题解】P1419 寻找段落(二分+单调队列)难度⭐⭐⭐★

    P1419 寻找段落 首先二分答案,即:二分最大平均值. 我们将a全部减去mid,问题转化为判断是否存在一个长度在s~t范围内的区间它的和为正,如果有说明还有更大的平均值. 用前缀和和单调队列维护. ...

  9. 【数据结构】单调栈和单调队列 详解+例题剖析

    算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...

最新文章

  1. Python中的三目运算符------if else 同行
  2. 《Generative Face Completion》论文笔记
  3. 解决thymeleaf报错 $ is not defined
  4. c++ 或者 vc++中判断程序实例是否运行
  5. linux7有相当于wget的,centos7安装mwget下载资源,提升下载速度
  6. Flask框架flash消息闪现学习与优化符合闪现之名
  7. Java-计算程序运行时间
  8. 多帧点云数据拼接合并_点云拼接
  9. Codeforces1388 D. Captain Flint and Treasure(贪心)
  10. NEFU 1266 快乐的雨季 (线段树)
  11. 强化学习——蒙特卡洛方法
  12. 干货:esp32彩屏自制太空人主题透明手表!
  13. java nas smb_FreeNAS 02:深入 SMB 服务使用
  14. 自定义钉钉机器人发消息@所有人
  15. 【BDTC 2017】专访中兴通讯杜学军:uSmartInsight,大数据与人工智能融合平台
  16. 2020美赛D题原文及翻译
  17. 使用keras-bert进行中文文本分类+Google colab运行源码
  18. Ner-Ocr识别文本格式化问题
  19. 操作系统之多道批处理,分时,实时系统
  20. R3DS Wrap基本使用方法

热门文章

  1. 如何在Linux实现自动运行程序
  2. asm管理的dg数据文件缺失的处理方法
  3. oracle-25031安装错误分析解决
  4. Tautology--POJ 3295
  5. 使用SAX解析XML封装实体Bean
  6. pythonweb框架Flask学习笔记05-简单登陆
  7. Socket.IO 客户端 API IO
  8. Java处理正则验证手机号-详解
  9. 成就PHP高手的五个必由之路
  10. java中synchronized使用方法