uva1400 区间最大连续和 线段树

关于并网继电器的继电器自检逻辑及实现方式 对于常规的光伏并网逆变器来说,继电器控制至关重要。继电器一般位于逆变电感后,共模电感前,用于将逆变电压与电网电压脱开,一般国外有双继电器的安规强制认证要求,国内目前只需要单继电器要求(后续应该会有双继电器要求,个人感觉) 阅读详情

After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hungry. In return for Neal's help, Ray makes a great dinner for Neal. When it is time for dinner, Ray arranges all the dishes he makes in a single line (actually this line is very long ..., the dishes are represented by 1, 2, 3 ...). ``You make me work hard and don't pay me! You refuse to teach me Latin Dance! Now it is time for you to serve me", Neal says to himself.

Every dish has its own value represented by an integer whose absolute value is less than 1,000,000,000. Before having dinner, Neal is wondering about the total value of the dishes he will eat. So he raises many questions about the values of dishes he would have.

For each question Neal asks, he will first write down an interval [a, b] (inclusive) to represent all the dishes a, a + 1,..., b, where a and b are positive integers, and then asks Ray which sequence of consecutive dishes in the interval has the most total value. Now Ray needs your help.

Input 

The input file contains multiple test cases. For each test case, there are two integers n and m in the first line (n, m < 500000). n is the number of dishes and m is the number of questions Neal asks.

Then n numbers come in the second line, which are the values of the dishes from left to right. Next m lines are the questions and each line contains two numbers a, b as described above. Proceed to the end of the input file.

Output 

For each test case, output m lines. Each line contains two numbers, indicating the beginning position and end position of the sequence. If there are multiple solutions, output the one with the smallest beginning position. If there are still multiple solutions then, just output the one with the smallest end position. Please output the result as in the Sample Output.

Sample Input 

3 1 
1 2 3 
1 1

Sample Output 

Case 1: 
1 1

  给出长度为N的整数序列,对于询问(a,b),找到两个下标x,y,a<=x<=y<=b,使x到y区间连续和最大。

  把区间[a,b]分成两半,设mid=(a+b)/2,答案区间可能在[a,mid],[mid+1,b],也可能开始在前一半,结束在后一半。设max_prefix[x]为点x包含区间的最大前缀的右边坐标,max_suffix[x]为点x包含区间的最大后缀的左边坐标,pair类型的max_sub[x]为点x包含区间的最大区间左右坐标。建树的时候算出每个节点的这三个值。询问的时候重要的是处理开始在前一半,结束在后一半的情况,同时要查找到[L,mid]的后缀和[mid+1,R]的前缀。因此还需要两个询问函数询问前缀和后缀,这两个询问比较特殊,不用同时给出ql和qr,如果是前缀,询问区间就是[L,qr],如果是后缀,询问区间是[ql,R],查询函数也有点不一样。

  代码很长,但思路比较清楚,sum函数用到了多态性。

#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0x3f3f3f3f
#define MAXN 500010
#define MAXNODE 1000010
using namespace std;

typedef pair<int,int> Interval;

int N,Q;
long long prefix_sum[MAXN];

long long sum(int L,int R){
    return prefix_sum[R]-prefix_sum[L-1];
}

long long sum(Interval a){
    return sum(a.first,a.second);
}

Interval better(Interval a,Interval b){
    if(sum(a)==sum(b)) return a<b?a:b;
    return sum(a)>sum(b)?a:b;
}

struct IntervalTree{
    int max_prefix[MAXNODE],max_suffix[MAXNODE];
    Interval max_sub[MAXNODE];

    void build(int o,int L,int R){
        if(L==R){
            max_prefix[o]=max_suffix[o]=L;
            max_sub[o]=make_pair(L,L);
            return;
        }

        //创建子树
        int mid=(L+R)/2,l=o<<1,r=(o<<1)+1;
        build(l,L,mid);
        build(r,mid+1,R);

        long long s1,s2;
        s1=sum(L,max_prefix[l]);
        s2=sum(L,max_prefix[r]);
        if(s1==s2) max_prefix[o]=max_prefix[l];
        else max_prefix[o]=s1>s2?max_prefix[l]:max_prefix[r];

        s1=sum(max_suffix[l],R);
        s2=sum(max_suffix[r],R);
        if(s1==s2) max_suffix[o]=max_suffix[l];
        else max_suffix[o]=s1>s2?max_suffix[l]:max_suffix[r];

        max_sub[o]=better(max_sub[l],max_sub[r]);
        max_sub[o]=better(max_sub[o],make_pair(max_suffix[l],max_prefix[r]));
    }

    //[L,qr]的最大前缀区间
    Interval query_prefix(int o,int L,int R,int qr){
        if(max_prefix[o]<=qr) return make_pair(L,max_prefix[o]);
        int mid=(L+R)/2;
        if(qr<=mid) return query_prefix(o<<1,L,mid,qr);
        Interval i=query_prefix((o<<1)+1,mid+1,R,qr);
        i.first=L;
        return better(i,make_pair(L,max_prefix[o<<1]));
    }

    //[ql,R]的最大前缀区间
    Interval query_suffix(int o,int L,int R,int ql){
        if(max_suffix[o]>=ql) return make_pair(max_suffix[o],R);
        int mid=(L+R)/2;
        if(ql>mid) return query_suffix((o<<1)+1,mid+1,R,ql);
        Interval i=query_suffix(o<<1,L,mid,ql);
        i.second=R;
        return better(i,make_pair(max_suffix[(o<<1)+1],R));
    }

    //[ql,qr]的最大区间
    Interval query_sub(int o,int L,int R,int ql,int qr){
        if(ql<=L&&qr>=R) return max_sub[o];
        int mid=(L+R)/2;
        if(qr<=mid) return query_sub(o<<1,L,mid,ql,qr);
        if(ql>mid) return query_sub((o<<1)+1,mid+1,R,ql,qr);
        Interval i1=query_prefix((o<<1)+1,mid+1,R,qr);
        Interval i2=query_suffix(o<<1,L,mid,ql);
        Interval i3=better(query_sub(o<<1,L,mid,ql,qr),query_sub((o<<1)+1,mid+1,R,ql,qr));
        return better(i3,make_pair(i2.first,i1.second));
    }
}tree;

int main(){
    freopen("in.txt","r",stdin);
    int cas=0;
    while(scanf("%d%d",&N,&Q)!=EOF){
        prefix_sum[0]=0;
        for(int i=1;i<=N;i++){
            int t;
            scanf("%d",&t);
            prefix_sum[i]=prefix_sum[i-1]+t;
        }
        tree.build(1,1,N);
        printf("Case %d:\n",++cas);
        while(Q--){
            int ql,qr;
            scanf("%d%d",&ql,&qr);
            Interval ans=tree.query_sub(1,1,N,ql,qr);
            printf("%d %d\n",ans.first,ans.second);
        }
    }
    return 0;
}



使用Android Studio调试系统应用之TvSettings(一):移植 对于做ROM的同仁、以及想要深入学习Android同学,必定会去调试Android的系统APK,而 *aosp* 源码中的系统APK源码,无法直接在Android Studio中进行调试,本文将持续更新细节,手把手教你,使用Android Studio调试安卓的系统应用。在每个阶段,提供知识点的梳理、总结,为您答疑解惑! 阅读详情

相关推荐

SAP交货单过账避坑指南:序列号处理、Buffer清理与BAPI提交回滚的那些事儿

本文深入解析SAP交货单过账中的序列号处理、Buffer清理与BAPI提交回滚等关键问题,提供WS_DELIVERY_UPDATE和BAPI_OUTB_DELIVERY_CONFIRM_DEC的实战优化方案。通过详细的技术分析和最佳实践,帮助开发者避免常见陷阱,提升交货单处理的稳定性和效率。

weixin_31155097的博客 431

UVA1400 “Ray, Pass me the dishes!“

这个题做过很多次了,但是这个有点特别,就是查询操作,一个修改操作没有,但是特别麻烦,除了原先需要维护的数据,还要多维护4个数据,分别是最大值的左右区间,最大前缀的右边界,最大后缀的左边界,然后更新这些数据的时候还要按照题目的要求来,总共是三个标尺,写起来很麻烦,但是我还是20分钟写过了,代码应该还可以缩短但是没有那么干了,里面有的地方是逻辑重复的,知识点:线段树,分治。

m0_73035684的博客 180

光伏系统选型指南:5种主流MPPT算法优缺点对比(附选型流程图)

本文深入剖析了光伏系统中五种主流MPPT算法的核心原理与性能差异。通过对比扰动观察法、电导增量法、恒定电压法、模糊逻辑控制及人工智能算法在追踪精度、响应速度、实现成本与稳定性等方面的表现,为不同应用场景(如户用、工商业及大型电站)提供了清晰的选型决策流程图和实战指南,帮助工程师优化系统效率与投资回报。

weixin_29294597的博客 106

uva 1400 - "Ray, Pass me the dishes!"(线段树)

题目链接:uva 1400 - "Ray, Pass me the dishes!" 题目大意:给定一个长度为n个整数序列,对m次询问作出回答,对于每次询问(a,b),找到两个下标x,y使得x到y的连续和为区间a,b中最大的连续和,如果存在多解优先x小,然后y小。 解题思路:线段树,对于每个节点维护三个线段值: max_sub:区间连续最大和max_prefix:区间连续前缀最大

不慌不忙、不急不躁 1777

给粒子物理萌新的Geant4保姆级入门:从看懂B1示例代码到跑通第一个模拟

本文为粒子物理初学者提供Geant4的保姆级入门指南,从解析B1示例代码到跑通第一个模拟。详细介绍了环境准备、代码解析、可视化系统实战及扩展模拟的方法,帮助新手快速掌握Geant4的基本概念和工具包使用。

weixin_29231725的博客 500

YOLOv8改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣本专栏已更新150多种不同的改进方法,所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行。2️⃣所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,紧跟学术热点,适应不同的任务场景。3️⃣团队内发表数篇SCI论文,熟悉完整的发表流程,订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容。4️⃣专栏内容会持续更新,最近更新时间:2024-12-24。项目介绍在大家购买专栏后,加入学

Limiiiing的博客 1万+

uva1400

#include <iostream> #include <istream> #include <sstream> #include <vector> #include <stack> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <cstring&gt

小刀刺大熊 269

二十八.国民技术MCU开发之UID获取与应用

在国民NT MCU中均有一个96位和128位的唯一设备标识符,其中UCID128 位, UID 为 96 位。手册中描述的作用是:通常用来做为序列号或作为密码,在编写闪存时,将此唯一标识与软件加解密算法相结合,进一步提高代码在闪存存储器内的安全性,也可用于激活带安全功能的自举程序(SecureBootloader)。UCID 和 UID,遵守国民技术芯片序列号定义,它包含芯片生产及版本相关信息。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 1677

uva 1400题解

 After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hungry. In return for Neal's help, Ray makes a great dinner for Neal. When it is time for dinner, Ray arranges all t

GODSPEED 615

代数拓扑与AI架构:AI应用架构师深入探索数学研究如何分析复杂系统的结构特性

随着人工智能技术的飞速发展,AI系统变得越来越复杂。AI应用架构师需要有效的工具和方法来理解、设计和优化这些复杂系统。代数拓扑作为数学的一个分支,提供了独特的视角和技术来分析复杂系统的结构特性。本文旨在帮助AI应用架构师深入了解代数拓扑,以及如何将其应用于AI架构设计中,提升对复杂系统的分析能力。首先,我们会介绍代数拓扑和AI架构相关的核心概念及其联系,通过有趣的故事引入主题,让读者轻松理解复杂概念。接着,深入探讨代数拓扑的核心算法原理,结合具体的编程语言代码示例详细阐述。

大模型应用工坊 670

基于YOLOv5与改进遗传算法的动态路径规划方法研究

摘要 本文提出一种融合YOLOv5目标检测与改进遗传算法的动态路径规划方法。通过YOLOv5实时感知环境中的动态和静态障碍物,将语义信息转化为栅格地图。针对传统遗传算法在路径规划中易早熟收敛、局部搜索能力差等问题,提出自适应初始化种群策略、动态变异算子及精英保留机制等改进方案。仿真结果表明,该方法在动态环境中能规划出更安全、平滑且长度更优的路径,具有更强的环境适应性和鲁棒性。 关键词:路径规划;YOLOv5;遗传算法;动态环境;目标检测

huanghm88的专栏 939

UVA 1400

题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4146 经典线段树。。真的很经典的一个题。但是我断断续续写了接近两天才AC。主要是找BUG。。很多东西没有考虑完全,就开始写了。 在那个没有思考完全的代码下修改,太蛋碎了。 主要存

1835

2026年摩尔线程数字IC面试试卷带答案

本文摘要: 该试卷为数字IC设计笔试,满分120分,时长90分钟,包含单选题、波形分析题、多选题和代码设计题。重点考察时序约束(如set_false_path)、建立/保持时间、逻辑化简、复位机制、AXI协议、半导体工艺、状态机、GPU架构等核心知识点。多选题涉及异步FIFO设计、Verilog综合、亚稳态处理、C++关键字和低功耗技术。代码题要求实现单比特信号去毛刺电路,需稳定4个时钟周期才输出。试题解析详细,标注了企业面试高频考点,如摩尔线程自研的MUSA架构和花港GPU架构特点。整体内容专业性强,覆盖

Open 98

UVA 1400 1400 - "Ray, Pass me the dishes!"(线段树)

UVA 1400 - "Ray, Pass me the dishes!" 题目链接 题意:给定一个序列,每次询问一个[L,R]区间,求出这个区间的最大连续子序列和 思路:线段树,每个节点维护3个值,最大连续子序列,最大连续前缀序列,最大连续后缀序列,那么每次pushup的时候,根据这3个序列去拼凑得到新的一个结点即可 代码: #include #include

Remilia's 1967

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

UVA 1400 1400 - "Ray, Pass me the dishes!"(线段树)

UVA 1400 - "Ray, Pass me the dishes!" 题目链接 题意:给定一个序列,每次询问一个[L,R]区间。求出这个区间的最大连续子序列和 思路:线段树,每一个节点维护3个值。最大连续子序列。最大连续前缀序列,最大连续后缀序列,那么每次pushup的时候,依据这3个序列去拼凑得到新的一个结点就可以 代码: #include &lt...

weixin_34375251的博客 109

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

UvaLA 3938 "Ray, Pass me the dishes!"

"Ray, Pass me the dishes!" Time Limit:3000MS Memory Limit:Unknown 64bit IO Format:%lld & %llu [Submit] [Go Back] [Status] Descripti...

weixin_30338497的博客 179

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

UVA 1400 "Ray, Pass methe dishes!"(线段树,区间合并)

UVA 1400 "Ray, Pass methe dishes!"(线段树,区间合并) 分析:        本题比较复杂,详解见:刘汝佳训练指南P201        建立一棵线段树,每个节点维护下面3种信息max_sub,max_prefix和max_suffix,分别表示最大连续和,并保存相应的坐标信息x[],y[],p[],s[].然后对于一个查询[20,50]区间的最大连续和,由

code 1474

线段树(1):点修改 (uva 1400 Ray,Pass me the Dishes)

给出一个有n个元素的数组A1,A2,.........,,A

LHYL 1145

2019.8.28训练总结

今天还是看的线段树,稍微复杂点的线段树都感觉很难啊,有些技巧性的东西比较难理解,比如将区间映射到整数,一开始没看懂什么意思,后来看了个类似的题才懂了。看着博客多处提到了《算法竞赛进阶指南》就买了一本,质量应该不会太差,用来查阅资料。 总结一下今天看的题目: POJ 2886 Who Gets the MostCandies?(线段树+模拟+求数的约数个数) 求约数个数可以预处理: void get...

weixin_43438700的博客 124

uva 1400 动态连续最大和

题目大意就是求给出n个数的排列,求其中连续的最大和,由于会有n多的查询,查询是任意的,那么就是动态的查询,RMQ解决不了这样的问题,用线段树可以实现动态查询,还好本题没要更新,不过光记录的信息就会有很多,思路是根据训练指南上面给的思路,构造一棵线段树,其中每个结点维护3个值:max_sub(a,b),max_prefix(a,b),max_suffix(a,b),然后通过区间合并维护建树,最后在已

NiaNiaJR的专栏 773

UVA1400 Ray, Pass me the dishes!" 【线段树 区间合并】

"Ray, Pass me the dishes!" UVA - 1400 https://vjudge.net/problem/UVA-1400 题意 给出一个长度为n的整数序列D,对m个询问做出回答,对询问(a,b)找到(x,y)使得a<=x<=y<=b且Dx+Dx+1+……+Dy最大。如有多组答案取字典序最小的一组。 题解 sum[i]记录结点i控制的区间...

逐梦者 258

UVa1400

After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hungry. In return for Neal’s help, Ray makes a great dinner for Neal. When it is time for dinner, Ray arranges all the di

hyqsblog的专栏 750

POJ 3667 Hotel(线段树:区间覆盖,维护最大连续子区间)

POJ 3667 Hotel(线段树:区间合并) 分析:        首先本题类似于UVA1400 ,所有区间合并类的线段树基本都需要维护3类信息:最大区间,最大前缀,最大后缀.        维护一棵线段树,该线段树每个节点维护信息:在该节点所代表的区间内的覆盖情况cover: 为0时表示没有被覆盖,为1时表示被覆盖了,为-1时表示子节点中既有被覆盖的也有没被覆盖的. 最长连续区间长度

code 2215

UVA1400----线段树的单点更新(十分的搞人啊)

题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=501&page=show_problem&problem=4146 题意: 给你n个数字,然后有Q次查询 每次查询,给出两个数字a,b 要你找出满足a 因为有多次查询,所以用暴力的方法肯定承受不了 而线段树可以解决这个问

Bob Lee's Blog For CS 922

线段树区间合并——UVA 1400

"Ray, Pass me the dishes!" Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description After doing Ray a great favor to collect sticks for Ray,

大田二十 587

UVa 1400(LA 3938)动态最大连续和

【题目链接】 http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36216 【解题报告】 刘汝佳的《训练指南》里,我觉得这道题目讲的不够详细(并且书上貌似有一点印刷错误?)。 在网上找了很多题解,不过觉得代码写的很丑。直到我看到了这篇题解,觉得代码写的非常漂亮,就虚心学习了。 http://blog.c

gungnir0711的博客 403
上一篇: RMQ sparse-table
下一篇: uva11992 - Fast Matrix Operations 区间修改 二维线段树
小小小小葱
博客等级 码龄14年 22粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值