`
darren_nizna
  • 浏览: 72935 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

[HDU][3415][Max Sum of Max-K-sub-sequence][线段树]

 
阅读更多

原题意思是求一个不超过 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 线段树题目+源代码 线段树是一种非常重要的数据结构,它广泛应用于算法竞赛和实际编程中。今天,我们将通过 ACM hdu 的几个题目来学习和掌握线段树的基本概念和应用。 线段树的基本概念 线段树是一种...

    HDU-Coder-X#Daily-question-of-Leetcode#2021-09-24-430. 扁平化多级双向链表

    示例 1:输出:[1,2,3,7,8,11,12,9,10,4,5,6]输入的多级列表如下图所示:扁平化后的链表如下图:示例 2:输出:[1,3,2]解释:输入

    hdu 1166线段树

    标题与描述均提到了“hdu 1166线段树”,这表明文章的核心是关于线段树在解决特定问题中的应用。线段树是一种数据结构,主要用于处理区间查询和更新操作,尤其是在大规模数据集上。在本例中,通过分析给定的部分代码...

    hdu acm1166线段树

    hdu 1166线段树代码

    HDU数据库单元原理(Oracle)-20081121-B-1.0

    标题中的“HDU数据库单元原理(Oracle)”是指在华为的HLR(Home Location Register)系统中,关于数据库单元的设计和实现原理,特别是基于Oracle数据库系统的部分。HLR是移动通信网络中的核心组件,用于存储用户的...

    HDU-Coder-X#Daily-question-of-Leetcode#2022-04-04-307. 区域和检索 - 数

    其中一类查询要求 更新 数组 nums 下标对应的值另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和

    HDU-Coder-X#Daily-question-of-Leetcode#2021-12-12-709. 转换成小写字母1

    示例 1:示例 2:解答:大小写转换: n = n ^ 32转小写: n = n | 32转大写: n = n & -33const toLowerCase =

    HDU-Coder-X#Daily-question-of-Leetcode#2022-02-26-2016. 增量元素之间的最

    2016. 增量元素之间的最大差值题目描述:给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i]

    HDU-Coder-X#Daily-question-of-Leetcode#2022-01-15-1716. 计算力扣银行的钱

    示例 2:输入:n = 10输出:37解释:第 10 天后,总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4) = 37

    HDU-Coder-X#Daily-question-of-Leetcode#2022-03-20-2039. 网络空闲的时刻1

    从第 1 秒开始,每 一秒最 开始 时,每个数据服务器都会检查它是否收到了主服务器的回复信息(包括新发出信息的回复信息):如果还没收到任何回复信息,那么该服务器

    线段树完整版

    ### 线段树知识点详解 #### 一、线段树基本概念与应用 线段树是一种二叉树数据结构,常用于处理区间查询或区间更新的问题。它将一个线性序列分割成多个不连续的段,每一个节点代表一个区间,并且通过递归的方式将...

    hdu1297.rar_SUM_hdu1297

    杭电acm1297 #include&lt;stdio.h&gt; #include&lt;string.h&gt; #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]++ } }

    (HDUACM202002版_11)-组合博弈.pptx

    Nim 游戏的分析可以使用 Nim-Sum 概念,Nim-Sum 是指将多个数字按照一定的规则进行组合的结果。定理一表明,对于 Nim 游戏的某个位置,当且仅当它各部分的 Nim-Sum 等于 0 时,则当前位于必败点。 组合博弈是研究...

    【hdu5306】Gorgeous Sequence 线段树区间最值操作-附件资源

    【hdu5306】Gorgeous Sequence 线段树区间最值操作-附件资源

    ACM HDU 2000-2099 解题报告 杭电 ACM

    《ACM HDU 2000-2099 解题报告 杭电 ACM》是一份详尽的编程竞赛解题集,主要涵盖了杭电(Hangzhou Dianzi University)在线判题系统(HDU OJ)上的2000至2099号题目。这份解题报告是针对参与ACM/ICPC(国际大学生...

    hdu 2000 -2099 题集

    这些题目来自于杭州电子科技大学的在线评测系统HDU的题集,涵盖了从2000到2009的编号。这些题目旨在测试编程者的基本算法理解、数学计算能力以及问题解决技巧。以下是对这些题目中涉及知识点的详细解释: 1. **2000...

    HH神总结的线段树专辑-超经典的

    ### 线段树经典知识点解析 #### 一、线段树简介与代码风格 **线段树**是一种用于高效处理区间查询与更新操作的数据结构。它可以用来解决一系列与区间有关的问题,例如区间求和、区间最值等问题。相较于其他数据...

    2019 Multi-University Training Contest 4(2019hdu多校第六场数据与标程)rar

    在编程竞赛的世界里,HDU(Hangzhou Dianzi University)举办的Multi-University Training Contest一直备受关注,尤其是2019年的第六场赛事,更是吸引了众多参赛者一展才华。这个名为"2019 Multi-University ...

    线段树入门学习(兼解HDU1754)

    这篇博客“线段树入门学习(兼解HDU1754)”旨在帮助初学者理解线段树的基本概念,并通过解决HDU1754题目来实践其应用。 线段树的核心思想是将一个区间分解成多个子区间,然后对每个子区间进行预处理,存储区间的信息...

Global site tag (gtag.js) - Google Analytics