HDU 3415 Max Sum of Max-K-sub-sequence【单调队列】
<题目链接>
题目大意:
给你一段从1~N的圆形序列,要你求出这段圆形序列中长度不超过K的最大连续子序列之和是多少,并且输出这子序列的起点和终点。
解题分析:
既然是求连续子序列之和,我们不妨将这段序列的前缀和算出来。因为本题规定了序列的最长长度,很容易想到单调队列,我们可以用一个单调队列去维护前缀和的最小值,让每一次移动的最小的前缀和都为单调队列的队首,也就是该单调队列为单调递增的序列。对于新访问的点,如果它的前缀和小于队列的尾端,那么删除队列的尾端,将其插入队列的合适位置,维护队列的递增性。如果遍历到的点的下标与队列头节点下标之差>K,说明队列维护的连续序列的长度不符合题目要求,将队列头结点删除。最终,每一次遍历,队列的头结点的下标到 i (i此时为队列的尾节点下标) 为每一次的最大连续和的序列(因为队列的头结点始终维护的是在指定区间内最小的前缀和)。需要注意的是,假如 队列记录的是 a~ i 这段连续子序列,那么只需要记录 a-1 就够了,因为[a,i]这段序的和为 sum[i]-sum[a-1],方便计算。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int M=*+;
#define INF 1e9
int a[M],q[M]; int main(){
int _;scanf("%d",&_);
while(_--){
int n,k;
scanf("%d %d",&n,&k);
a[]=;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
a[i]+=a[i-];
}
for(int i=n+;i<n+k;i++){ //将这个序列补到n+k-1,因为每个位置作为单调序列的头节点的情况都要考虑
a[i]=a[n]+a[i-n];
}
int mx=-INF,st,et;
int head=,tail=;
for(int i=;i<=n+k-;i++){
while(head<tail&&a[i-]<a[q[tail-]])//tail-1才是尾节点的位置,tail为代插入节点的位置,该优先队列维护的是前缀和的最小值,是一个关于前缀和的单调递增序列,然后根据为尾节点-头节点
--tail;
q[tail++]=i-; //q[]数组记下i-1的下标,方便求前缀和的时候做差
while(head<tail&&i-q[head]>k) //如果队首坐标与队尾坐标相差大于k,则将队首删除
++head;
if(mx<a[i]-a[q[head]]){ //如果单调队列维护的这个区间和大于当前最大值
mx=a[i]-a[q[head]];
st=q[head]+;
et=i>n?i%n:i;
}
}
printf("%d %d %d\n",mx,st,et);
}
return ;
}
2018-09-23
HDU 3415 Max Sum of Max-K-sub-sequence【单调队列】的更多相关文章
- HDU 4123 Bob's Race:树的直径 + 单调队列 + st表
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...
- HDU 4193 Non-negative Partial Sums(想法题,单调队列)
HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...
- HDU 5945 / BestCoder Round #89 1002 Fxx and game 单调队列优化DP
Fxx and game 问题描述 青年理论计算机科学家Fxx给的学生设计了一款数字游戏. 一开始你将会得到一个数\:XX,每次游戏将给定两个参数\:k,tk,t, 任意时刻你可以对你的数执行下面 ...
- HDU 3410 && POJ 3776 Passing the Message 单调队列
题意: 给定n长的数组(下标从1-n)(n个人的身高,身高各不同样 问:对于第i个人,他能看到的左边最矮的人下标.(假设这个最矮的人被挡住了,则这个值为0) 还有右边最高的人下标,同理若被挡住了则这个 ...
- hdu 1003 Max Sum (DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1081:To The Max
To The Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- hdu 3415 单调队列
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU 3530 单调队列
题目大意:给你n个数, 让你问你最长的满足要求的区间有多长,区间要求:MAX - MIN >= m && MAX - MIN <= k 思路:单调队列维护递增和递减,在加入 ...
- HDU 3415 Max Sum of Max-K-sub-sequence 最长K子段和
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3415 意甲冠军:环.要找出当中9长度小于等于K的和最大的子段. 思路:不能採用最暴力的枚举.题目的数据量是 ...
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
题目链接:hdu 3415 Max Sum of Max-K-sub-sequence 题意: 给你一串形成环的数,让你找一段长度不大于k的子段使得和最大. 题解: 我们先把头和尾拼起来,令前i个数的 ...
随机推荐
- Swift 学习- 05 -- 集合类型
// 集合类型 // swift 提供 Arrays , Sets 和 Dictionaries 三种基本的集合类型用来存储数据 , 数组(Arrays) 是有序数据的集, 集合(Sets)是无序无重 ...
- Oracle11g 启动数据库实例、关闭数据库实例
Oracle11g 启动数据库实例 startup 1: nomount 模式: 描述: 该模式只会创建实例(即:创建oracle 实例的各种内存结构和 ...
- AFN 请求报 415错误解决方案
使用 AFHTTPSessionManager 发起请求时 设置下面两句代码 manager.requestSerializer = [AFJSONRequestSerializer seriali ...
- Android开发实战一 百度SDK
一 申请百度API key 百度地图API:http://developer.baidu.com/map/ 百度地图开发者平台地址:http://developer.baidu.com/map/ .点 ...
- package.json包描述文件说明
//commonjs包规范-说明 { "name": "leyi",//包名,不允许空格 "description": "hell ...
- mysql数据库之基本操作和存储引擎
一.知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student,scholl,class_list ...
- LeetCode(88):合并两个有序数组
Easy! 题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素 ...
- django----Form详细信息
Form类: 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; Django内置字段 Field required=True, 是否允许为 ...
- bzoj 2427
非常好的一道题,可以说是树形dp的一道基础题 首先不难发现,:如果我们把有关系的两个点用有向边相连,那么就会形成一个接近树的结构.如果这是一棵完美的树,我们就可以直接在树上打背包了 但是这并不是一棵完 ...
- MySQL5.7.20报错Access denied for user 'root'@'localhost' (using password: NO)
在centos6.8上源码安装了MySQL5.7.20,进入mysql的时候报错如下: 解决办法如下: 在mysql的配置文件内加入: vim /etc/my.cnf skip-grant-tabl ...