hdu 5316 Magician(2015多校第三场第1题)线段树单点更新+区间合并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5316
题意:给你n个点,m个操作,每次操作有3个整数t,a,b,t表示操作类型,当t=1时讲a点的值改成b;当t=0时,查询区间a,b之间最大的子序列和,这个子序列中的相邻的元素的原来的下标奇偶性都不同。
思路:这道题难点就在查询,其余都是模板,而根据查询,你只要分别把下一个区间的奇偶最大的情况分别比较,合并到上一个区间这样可以构建一个每个节点存有区间中奇开头偶开头,奇结尾,偶结尾这些区间情况的树。
代码:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector> #define N 100005
#define LL __int64
#define INF 0x3f3f3f3f
using namespace std;
#define ls rt<<1
#define rs rt<<1|1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 struct node
{
int l,r;
LL jo,oo,oj,jj;
}seg[N<<],aa;
LL ans;
void Push_Up(int rt)
{
seg[rt].jj=max(max(seg[ls].jj+seg[rs].oj,seg[ls].jo+seg[rs].jj),max(seg[ls].jj,seg[rs].jj));
seg[rt].oo=max(max(seg[ls].oo+seg[rs].jo,seg[ls].oj+seg[rs].oo),max(seg[ls].oo,seg[rs].oo));
seg[rt].jo=max(max(seg[ls].jj+seg[rs].oo,seg[ls].jo+seg[rs].jo),max(seg[ls].jo,seg[rs].jo));
seg[rt].oj=max(max(seg[ls].oo+seg[rs].jj,seg[ls].oj+seg[rs].oj),max(seg[ls].oj,seg[rs].oj));
} void Build(int l,int r,int rt)
{
seg[rt].l=l;
seg[rt].r=r;
if(l==r)
{
LL a;
scanf("%I64d",&a);
if(l&)
{
seg[rt].jj=a;
seg[rt].oo=-INF;
}
else
{
seg[rt].oo=a;
seg[rt].jj=-INF;
}
seg[rt].jo=seg[rt].oj=-INF;
return ;
}
int m=(l+r)>>;
Build(lson);
Build(rson);
Push_Up(rt);
} void Update(int p,int x,int rt)
{
if(seg[rt].l==seg[rt].r&&seg[rt].l==p)
{
if(p&)
seg[rt].jj=x;
else
seg[rt].oo=x;
return ;
}
int m=(seg[rt].l+seg[rt].r)>>;
if(p<=m)
Update(p,x,ls);
else
Update(p,x,rs);
Push_Up(rt);
} void Get(node ll,node rr)
{
aa.jj=max(max(ll.jj+rr.oj,ll.jo+rr.jj),max(ll.jj,rr.jj));
aa.oo=max(max(ll.oo+rr.jo,ll.oj+rr.oo),max(ll.oo,rr.oo));
aa.jo=max(max(ll.jj+rr.oo,ll.jo+rr.jo),max(ll.jo,rr.jo));
aa.oj=max(max(ll.oo+rr.jj,ll.oj+rr.oj),max(ll.oj,rr.oj));
} node Query(int l,int r,int rt)
{
if(seg[rt].l==l&&seg[rt].r==r)
{
aa=seg[rt];
ans=max(max(aa.jj,aa.jo),max(aa.oj,aa.oo));
return seg[rt];
}
int m=(seg[rt].l+seg[rt].r)>>;
ans=;
if(r<=m)
aa=Query(l,r,ls);
else if(l>m)
aa=Query(l,r,rs);
else
{
node ll,rr;
ll=Query(lson);
rr=Query(rson);
Get(ll,rr);
}
ans=max(max(aa.jj,aa.jo),max(aa.oj,aa.oo));
return aa;
} int main()
{
int n,m,a,b,t,T;
while(scanf("%d",&T)==)
{
while(T--)
{
scanf("%d%d",&n,&m);
Build(,n,);
while(m--)
{
scanf("%d%d%d",&t,&a,&b);
if(t==)
Update(a,b,);
else
{
Query(a,b,);
printf("%I64d\n",ans);
}
}
}
}
return ;
}
hdu 5316 Magician(2015多校第三场第1题)线段树单点更新+区间合并的更多相关文章
- HDU 3308 LCIS(线段树单点更新区间合并)
LCIS Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 题意:F(x) 表示x的不同质因子的个数结果是求L,R区间中最大的gcd( F(i) , F(j ...
- HDU 1754 I Hate It(线段树单点更新区间最值查询)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 1166敌兵布阵+NOJv2 1025: Hkhv love spent money(线段树单点更新区间查询)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1754 I Hate It 线段树 单点更新 区间最大值
#include<iostream> #include<string> #include<algorithm> #include<cstdlib> #i ...
- 【HDU】1754 I hate it ——线段树 单点更新 区间最值
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 1166线段树 单点更新 区间求和
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 3308 线段树单点更新+区间查找最长连续子序列
LCIS Time Limit: 6000/2000 MS (Java/Oth ...
随机推荐
- nodejs学习:net模块
官方API文档地址:https://nodejs.org/api/net.html 创建一个server.js var net = require('net'); var PORT = 8099; v ...
- 工具推荐:ATSCAN,功能强大的Perl脚本扫描器
工具推荐:ATSCAN,功能强大的Perl脚本扫描器 使用perl语言编写的开源的扫描器,功能丰富强大,除了基本的tcp和udp端口扫描之外,还可以搜索wordpress.joomla等网站并进行口令 ...
- Nginx/LVS/HAProxy负载均衡软件的优缺点详解【转】
转自 (总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解http://www.ha97.com/5646.html PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均 ...
- http://s22.app1105796624.qqopenapp.com/
http://s22.app1105796624.qqopenapp.com/ http://121.43.114.69/xiyou/app/js/ac_tx.js http://hiyouba.co ...
- java基础22 日期类、日历类、日期格式类
package com.dhb.code; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...
- LeetCode664. Strange Printer
There is a strange printer with the following two special requirements: The printer can only print a ...
- Linux学习笔记:ctrl+z、ctrl+c、ctrl+d的区别
ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样. 1.ctrl+c是强制中断程序的执行,进程已经终止. 2.ctrl+z的是将任务中止(暂停的意思),但是此任务并没有结束,他 ...
- Oracle学习笔记:decode函数
decode函数主要作用:将查询结果翻译成其他值(即以其他形式变现出来) 使用方法: SELECT DECODE(colunm_name,值1,翻译值1,值2,翻译值2……值n,翻译值n,缺省值) F ...
- HTTPS、SPDY和HTTP/2的性能比较
http://www.infoq.com/cn/news/2015/02/https-spdy-http2-comparison/ https://segmentfault.com/a/1190000 ...
- Hadoop案例(十一)MapReduce的API使用
一学生成绩---增强版 数据信息 computer,huangxiaoming,,,,,,, computer,xuzheng,,,,, computer,huangbo,,,, english,zh ...