题目链接: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题)线段树单点更新+区间合并的更多相关文章

  1. HDU 3308 LCIS(线段树单点更新区间合并)

    LCIS Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting ...

  2. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  3. 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 ...

  4. HDU 1754 I Hate It(线段树单点更新区间最值查询)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. HDU 1166敌兵布阵+NOJv2 1025: Hkhv love spent money(线段树单点更新区间查询)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. HDU 1754 I Hate It 线段树 单点更新 区间最大值

    #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #i ...

  7. 【HDU】1754 I hate it ——线段树 单点更新 区间最值

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. hdu 1166线段树 单点更新 区间求和

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. HDU 3308 线段树单点更新+区间查找最长连续子序列

    LCIS                                                              Time Limit: 6000/2000 MS (Java/Oth ...

随机推荐

  1. 查看linux服务器内存信息

    查看服务器内存信息 dmidecode|grep -P -A5 "Memory\s+Device"|grep Size [root@localhost home]# dmideco ...

  2. Django-模板继承、包含和静态文件配置

    一.模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板 ...

  3. ArcMap2SLD使用

    1.首先打开ArcMap,加载一副mxd地图: 2.打开ArcGIS2SLD,如下图所示: 3.选择样式文件的保存形式,一副mxd地图可能有多个图层,选中In Separate Dateien/In ...

  4. Elasticsearch零停机时间更新索引配置或迁移索引

    本文介绍Elasticsearch零宕机时间更新索引配置映射内容的方法,包括字段类型.分词器.分片数等.方法原理就是,利用别名机制,给索引配置别名,所有应用程序都通过别名访问索引.重建索引,通过索引原 ...

  5. JAVA随笔(二)

    在函数传参时,double传给int是不行的,反过来可以.参数只能传值.当参数是字符串时,传递的只是串值:但对于数组来说,传递的是管理权,也就是指针 对象变量是对象管理者. cast转型:基本类型与对 ...

  6. 【读书笔记】Android平台的漏洞挖掘和分析

    最近比较关注移动端的安全,以后也打算向安卓平台的安全发展.这篇博文主要是记录一些研究Android安全的读书笔记. Fuzzing技术的核心是样本生成技术 测试Android平台的组件间通信功能使用的 ...

  7. 定制Eclipse

    转载自http://chriszz.sinaapp.com 一般从Eclipse官网eclipse.org下载的,都是打包好的版本,比如标准版.jee版.java版.c++版.php版.测试版等.有时 ...

  8. Docker简介与安装(一)

    Docker简介 Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协 ...

  9. Gitlab Webhooks, External Services, and API(一)

    一. 和外部服务进行集成 Gitlab支持和不同的外部服务进行集成,比如可以和聊天工具,Slack或者Campfire进行集成,或者和项目管理工具进行集成.如Assembla或者Pivotal Tra ...

  10. thinkphp _complex 复合查询 where多个子组实现

    SELECT * FROM `user` WHERE ( `mobile` = '13824653465' OR `nickname` = 'evan' OR `openid` = '14545-fd ...