spoj 1716. Can you answer these queries III

2024-02-08 01:32
文章标签 iii answer queries spoj 1716

本文主要是介绍spoj 1716. Can you answer these queries III,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

spoj  1716. Can you answer these queries III


在spoj上做题的时候看到有人提交做这个题目,看名字就知道肯定是数据结构的题目,然后看了看,题意很简单.......然后看了半天也没想到可行的思路,我的思路主要是卡在一段子区间的和可以用sum[ r ] -sum [ l-1]来表示,如过让这个值最大那么贪心就是求给出的[ l , r ]  max(sum[ i])  - min(sum[j ])  i,j在[l,r]区间内的,但是i可能是i < j那么就不适用贪心了,然后就卡在了……想到用线段树,但是就没有往线段树区间和并方面想,看来线段树区间合并真是个神奇的东西!


看的别人的代码才明白的   http://blog.csdn.net/gotoac/article/details/7623857


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;const int maxn=50010;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
ll lsum[maxn<<2],msum[maxn<<2],rsum[maxn<<2],sum[maxn<<2];
struct Node{ll lsum,msum,rsum,sum;
};
void pushup(int rt)
{int ls=rt<<1,rs=rt<<1|1;lsum[rt]=max(lsum[ls],sum[ls]+lsum[rs]);msum[rt]=max(max(msum[ls],msum[rs]),rsum[ls]+lsum[rs]);rsum[rt]=max(rsum[rs],sum[rs]+rsum[ls]);sum[rt]=sum[ls]+sum[rs];
}
void build(int l,int r,int rt)
{if(l==r){scanf("%lld",&sum[rt]);lsum[rt]=rsum[rt]=msum[rt]=sum[rt];return;}int m=(l+r)>>1;build(lson);build(rson);pushup(rt);
}
void update(int p,ll val,int l,int r,int rt)
{if(l==r) {lsum[rt]=msum[rt]=rsum[rt]=sum[rt]=val;return;}int m=(l+r)>>1;if(p<=m) update(p,val,lson);else update(p,val,rson);pushup(rt);
}
Node query(int L,int R,int l,int r,int rt)
{Node ret;if(L<=l&&R>=r){ret.lsum=lsum[rt],ret.msum=msum[rt],ret.rsum=rsum[rt],ret.sum=sum[rt];return ret;}int m=(l+r)>>1;if(R<=m) return query(L,R,lson);if(L>m)  return query(L,R,rson);Node ret1=query(L,R,lson);Node ret2=query(L,R,rson);ret.lsum=max(ret1.lsum,ret1.sum+ret2.lsum);ret.msum=max(max(ret1.msum,ret2.msum),ret1.rsum+ret2.lsum);ret.rsum=max(ret2.rsum,ret2.sum+ret1.rsum);ret.sum=ret1.sum+ret2.sum;return ret;
}
int main()
{int n,m,l,r,cmd;while(scanf("%d",&n)==1){build(1,n,1);scanf("%d",&m);while(m--){scanf("%d%d%d",&cmd,&l,&r);if(cmd==0) update(l,r,1,n,1);else printf("%d\n",query(l,r,1,n,1).msum);}}return 0;
}


这篇关于spoj 1716. Can you answer these queries III的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689539

相关文章

HDU 2064 汉诺塔III(水题)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2064 题目大意: 有三根杆,求把n个圆盘从左边移到右边,最少需要移动圆盘的次数。移动规则为大盘不能放在小盘上,比原始的汉诺塔题改变的地方是,只能通过中间的杆往左右两边的杆移动。 心得: 此题心得在题外,不在题内,初看此题,尼玛吓了一跳,好像很难的样子,手贱百度了一下,只注意到俩字“水题”,赶紧

SOMEIP_ETS_088: SD_Answer_multiple_subscribes_together

测试目的: 验证设备(DUT)是否能够接受它接收到的每个SubscribeEventgroup条目。 描述 本测试用例旨在检查DUT在接收到包含多个SubscribeEventgroup条目的消息时,是否能够为每个条目发送SubscribeEventgroupAck。 测试拓扑: 具体步骤: TESTER:发送包含多个SubscribeEventgroup条目的消息,用于事件组:

【CodeForces】266E More Queries to Array... 线段树

E. More Queries to Array... time limit per test 5 seconds memory limit per test 256 megabytes input standard input output standard output You've got an array, consisting of n

【SPOJ】1825 Free tour II 点分治

传送门:【SPOJ】1825 Free tour II 题目分析:敲了两遍。。。 本题是论文题,具体见漆子超论文《分治算法在树的路径问题中的应用》。 在以root为根的第 i 棵子树上,我们用G[ i ,j ]表示root的第 i 棵子树的路径上严格有 j 个黑点的路径的最长长度。用F[ i ,j ]表示在root为根的第 i 棵子树的路径上不超过 j 个黑点的路径的最长长度。因

【SPOJ】Triple Sums【FFT】

传送门:【SPOJ】Triple Sums 题目分析: 首先我们不考虑 i<j<k i<j<k这个条件,构造多项式: Y=∑xai \qquad\qquad\qquad Y = \sum x^{a_i} 那么 ai+aj+ak=S ai+aj+ak=S的个数即 xai+aj+ak=S x^{a_i+a_j+a_k=S}的个数,等价于 Y3中xS Y^3中x^S的系数。 然后我们考虑容斥

推荐适合中秋的SVG模版(第III期)

宝藏模版 往期推荐(点击阅读): 趣味效果|高大上|可爱风|年终总结I|年终总结II|循环特效|情人节I|情人节II|妇女节|儿童节I|儿童节II|儿童节III|618I|618II|父亲节|丝滑动画|端午节I|端午节II|滑动妙用|图片轮播I|图片轮播II|又红又专|中秋节I|中秋节II|双十一I|双十一II|世界杯|圣诞节|新年|兔年春节|元宵节|愚人节|杂志范儿|520/521I|520

《Efficient Batch Processing for Multiple Keyword Queries on Graph Data》——论文笔记

ABSTRACT 目前的关键词查询只关注单个查询。对于查询系统来说,短时间内会接受大批量的关键词查询,往往不同查询包含相同的关键词。 因此本文研究图数据多关键词查询的批处理。为多查询和单个查询找到最优查询计划都是非常复杂的。我们首先提出两个启发式的方法使关键词的重叠最大并优先处理规模小的关键词。然后设计了一个同时考虑了数据统计信息和搜索语义的基于cardinality的成本估计模型。 1.

day-47 最大连续1的个数 III

思路 滑动窗口:如果用left和right表示连续1的左右边界,那么意味着可以把0修改为1的次数为k次 解题过程 用一个变量num记录left和right之间0的个数,当num<=k时,right++,num>k时,将left向右移动,直到不再满足num>k Code class Solution {public int longestOnes(int[] nums, int k) {in

[M滑动窗口] lc1004. 最大连续1的个数 III(滑动窗口+模板题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:1004. 最大连续1的个数 III 题单: 滑动窗口(定长/不定长/多指针) 二、不定长滑动窗口 §2.1 求最长/最大 2. 题目解析 思路: 比较直接的滑动窗口哈,好像也没什么需要注意的点。 前缀和+二分 也不是不能做。官解也提到了这个点。但对于本题来讲,看到就是滑窗,没毛病吧。 时间复

Queries for Number of Palindromes

~~~~~~       Queries for Number of Palindromes ~~~~~      总题单链接 思路 ~~~~~       设 g [ L ] [ R ] g[L][R] g[L][R] 表示区间 [ L , R ] [L,R] [L,R] 是否为回文串。 ~~~~~      预处理 g g g,枚举回文串的中点,从每个中点开始向两侧扩展,判断