原题意思是求一个不超过 k 的连续序列的和的最大值。
枚举连续序列的起点 i, 然后在 [i, i+k] 区间找一个最大值,更新答案。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max(a,b) ( (a)> (b)? (a): (b) )
#define min(a,b) ( (a)< (b)? (a): (b) )
int const N= 200010;
int dat[N], sum[N];
int n, nn, k;
struct Node{
int Max, pos;
Node(){}
Node( int a, int b ): Max(a), pos(b) {}
}tb[N<<2];
inline bool operator>( Node a, Node b ){
if( a.Max== b.Max ) return a.pos< b.pos;
return a.Max> b.Max; }
void build( int L, int R, int rt ){
if( L== R ){
tb[rt]= Node( sum[L], L );
return ;}
int mid= (L+ R)>>1;
build( L, mid, rt<<1 );
build( mid+ 1, R, rt<<1|1 );
tb[rt]= max( tb[rt<<1], tb[rt<<1|1] );
}
Node query( int a, int b, int L, int R, int rt ){
if( a== L && b== R ) return tb[rt];
int mid= (L+ R)>>1;
if( b<= mid ) return query( a, b, L, mid, rt<<1 );
else if( a> mid ) return query( a, b, mid+ 1, R, rt<<1|1 );
else{
Node x= query( a, mid, L, mid, rt<<1 );
Node y= query( mid+ 1, b, mid+ 1, R, rt<<1|1 );
return max(x,y);
}
}
inline int read(){
char ch;
int d, flag= 1;
while( ch= getchar(), ch== ' ' || ch== '\n' );
if( ch== '-' ) { flag= -1; d= 0; }
else{ d= ch- '0'; }
while( ch= getchar(), ch>= '0' && ch<= '9' )
d= d* 10+ ch- '0';
return d* flag;
}
int main(){
int test;
scanf("%d",&test );
while( test-- ){
scanf("%d%d",&n,&k );
for( int i= 1; i<= n; ++i ){
dat[i]= read();
dat[i+ n]= dat[i];
}
sum[0]= 0; nn= n<<1;
for( int i= 1; i<= nn; ++i )
sum[i]= sum[i-1]+ dat[i];
build( 1, nn, 1 );
int ans= -0x7fffffff, posx= 0, posy= 0;
for( int i= 0; i<= n; ++i ){
int t= min( i+ k, nn );
Node tmp= query( i+ 1, t, 1, nn, 1 );
if( tmp.Max- sum[i]> ans ){
ans= tmp.Max- sum[i];
posx= i+ 1;
posy= tmp.pos;
}
}
printf("%d %d ", ans, posx );
if( posy> n ) printf("%d\n", posy- n );
else printf("%d\n", posy );
}
return 0;
}
分享到:
相关推荐
ACM hdu 线段树题目+源代码 线段树是一种非常重要的数据结构,它广泛应用于算法竞赛和实际编程中。今天,我们将通过 ACM hdu 的几个题目来学习和掌握线段树的基本概念和应用。 线段树的基本概念 线段树是一种...
示例 1:输出:[1,2,3,7,8,11,12,9,10,4,5,6]输入的多级列表如下图所示:扁平化后的链表如下图:示例 2:输出:[1,3,2]解释:输入
标题与描述均提到了“hdu 1166线段树”,这表明文章的核心是关于线段树在解决特定问题中的应用。线段树是一种数据结构,主要用于处理区间查询和更新操作,尤其是在大规模数据集上。在本例中,通过分析给定的部分代码...
hdu 1166线段树代码
标题中的“HDU数据库单元原理(Oracle)”是指在华为的HLR(Home Location Register)系统中,关于数据库单元的设计和实现原理,特别是基于Oracle数据库系统的部分。HLR是移动通信网络中的核心组件,用于存储用户的...
其中一类查询要求 更新 数组 nums 下标对应的值另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和
示例 1:示例 2:解答:大小写转换: n = n ^ 32转小写: n = n | 32转大写: n = n & -33const toLowerCase =
2016. 增量元素之间的最大差值题目描述:给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i]
示例 2:输入:n = 10输出:37解释:第 10 天后,总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4) = 37
从第 1 秒开始,每 一秒最 开始 时,每个数据服务器都会检查它是否收到了主服务器的回复信息(包括新发出信息的回复信息):如果还没收到任何回复信息,那么该服务器
### 线段树知识点详解 #### 一、线段树基本概念与应用 线段树是一种二叉树数据结构,常用于处理区间查询或区间更新的问题。它将一个线性序列分割成多个不连续的段,每一个节点代表一个区间,并且通过递归的方式将...
杭电acm1297 #include<stdio.h> #include<string.h> #define m 1002 int f[m][70]={{1,1},{1,1},{1,2},{1,4}} void add(int p[],int q[],int sum[]) ...=10000){sum[i]-=10000 sum[i+1]++ } }
Nim 游戏的分析可以使用 Nim-Sum 概念,Nim-Sum 是指将多个数字按照一定的规则进行组合的结果。定理一表明,对于 Nim 游戏的某个位置,当且仅当它各部分的 Nim-Sum 等于 0 时,则当前位于必败点。 组合博弈是研究...
《ACM HDU 2000-2099 解题报告 杭电 ACM》是一份详尽的编程竞赛解题集,主要涵盖了杭电(Hangzhou Dianzi University)在线判题系统(HDU OJ)上的2000至2099号题目。这份解题报告是针对参与ACM/ICPC(国际大学生...
【hdu5306】Gorgeous Sequence 线段树区间最值操作-附件资源
### 线段树经典知识点解析 #### 一、线段树简介与代码风格 **线段树**是一种用于高效处理区间查询与更新操作的数据结构。它可以用来解决一系列与区间有关的问题,例如区间求和、区间最值等问题。相较于其他数据...
在编程竞赛的世界里,HDU(Hangzhou Dianzi University)举办的Multi-University Training Contest一直备受关注,尤其是2019年的第六场赛事,更是吸引了众多参赛者一展才华。这个名为"2019 Multi-University ...
这篇博客“线段树入门学习(兼解HDU1754)”旨在帮助初学者理解线段树的基本概念,并通过解决HDU1754题目来实践其应用。 线段树的核心思想是将一个区间分解成多个子区间,然后对每个子区间进行预处理,存储区间的信息...