题意:给你一个序列,支持两种操作:单点修改;询问一个区间中所有相邻位置下标奇偶性均不同的子序列中,和最大的是多少。

线段树每个结点维护四个值:

以奇数下标开始到奇数下标结束的最大子序列和;

以偶数下标开始到偶数下标结束的最大子序列和;

以奇数下标开始到偶数下标结束的最大子序列和;

以偶数下标开始到奇数下标结束的最大子序列和。

合并的时候先在左右两区间中取较大者,然后奇-偶的答案能通过奇-奇+偶-偶、奇-偶+奇-偶得到;奇-奇的答案能通过奇-奇+偶-奇、奇-偶+奇-奇得到……这样讨论一下。

#include<cstdio>
#include<algorithm>
using namespace std;
int ss[4][2][2];
typedef long long ll;
const ll INF=1000000000000000ll;
int n,m;
struct data{
ll x[4];
data(const ll &x,const ll &y,const ll &z,const ll &w){
this->x[0]=x;
this->x[1]=y;
this->x[2]=z;
this->x[3]=w;
}
data(){}
ll maxx(){
return max(x[0],max(x[1],max(x[2],x[3])));
}
};
data sumv[400005];
data pushup(data ls,data rs){
data res;
for(int i=0;i<4;++i){
res.x[i]=max(ls.x[i],rs.x[i]);
for(int j=0;j<2;++j){
if(ls.x[ss[i][j][0]]>-INF && rs.x[ss[i][j][1]]>-INF){
res.x[i]=max(res.x[i],ls.x[ss[i][j][0]]+rs.x[ss[i][j][1]]);
}
}
}
return res;
}
void buildtree(int rt,int l,int r){
if(l==r){
ll t;
if(l&1){
scanf("%lld",&t);
sumv[rt]=data(t,-INF,-INF,-INF);
}
else{
scanf("%lld",&t);
sumv[rt]=data(-INF,t,-INF,-INF);
}
return;
}
int m=(l+r>>1);
buildtree(rt<<1,l,m);
buildtree(rt<<1|1,m+1,r);
sumv[rt]=pushup(sumv[rt<<1],sumv[rt<<1|1]);
}
void update(int p,ll v,int rt,int l,int r){
if(l==r){
if(l&1){
sumv[rt]=data(v,-INF,-INF,-INF);
}
else{
sumv[rt]=data(-INF,v,-INF,-INF);
}
return;
}
int m=(l+r>>1);
if(p<=m){
update(p,v,rt<<1,l,m);
}
else{
update(p,v,rt<<1|1,m+1,r);
}
sumv[rt]=pushup(sumv[rt<<1],sumv[rt<<1|1]);
}
data query(int ql,int qr,int rt,int l,int r){
if(ql<=l && r<=qr){
return sumv[rt];
}
int m=(l+r>>1);
data res;
if(ql<=m && m<qr){
res=pushup(query(ql,qr,rt<<1,l,m),query(ql,qr,rt<<1|1,m+1,r));
}
else if(ql<=m){
res=query(ql,qr,rt<<1,l,m);
}
else{
res=query(ql,qr,rt<<1|1,m+1,r);
}
return res;
}
int main(){
// freopen("j.in","r",stdin);
ss[0][0][0]=0; ss[0][0][1]=3; ss[0][1][0]=2; ss[0][1][1]=0;
ss[1][0][0]=1; ss[1][0][1]=2; ss[1][1][0]=3; ss[1][1][1]=1;
ss[2][0][0]=0; ss[2][0][1]=1; ss[2][1][0]=2; ss[2][1][1]=2;
ss[3][0][0]=1; ss[3][0][1]=0; ss[3][1][0]=3; ss[3][1][1]=3;
scanf("%d%d",&n,&m);
buildtree(1,1,n);
int op,x,y;
for(int i=1;i<=m;++i){
scanf("%d%d%d",&op,&x,&y);
if(op!=1){
printf("%lld\n",query(x,y,1,1,n).maxx());
}
else{
update(x,y,1,1,n);
}
}
return 0;
}

【线段树】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem J. Jedi Training的更多相关文章

  1. 【贪心】【后缀自动机】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem E. Enter the Word

    题意:给你一个串,让你从左到右构造这个串,一次操作可以直接在当前串后面添加一个任意字符,或者拷贝当前串的任意一个子串到当前串的后面.问你最少要多少次操作才能构造出这个串. 从前向后贪心,从当前已构造的 ...

  2. 【DFS】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem D. Divisibility Game

    题意:给你一个序列,长度不超过52,每个元素不超过13.让你重新对这个序列排序,sum(i)表示i的前缀和,使得排序过后,对每个i,都有sum(i)%i==0. 深搜,加两个优化:①倒着从后向前搜:② ...

  3. 【二分】【三分】【计算几何】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem L. Lines and Polygon

    题意:给你一个凸多边形,和多次询问,每次询问给你一条直线,问你这条直线与凸包上的顶点的最近距离是多少. 记当前询问的直线的斜率为K, 先找到与这条直线距离最远的两个点: 就把凸包所有的边当做有向直线进 ...

  4. 【线段树成段更新成段查询模板】【POJ3468】A Simple Problem with Integerst

    题目大意: 2个操作 A.区间a b 增加 c B 查询a b; 注意事项:1.记住要清除标记 2.查询时要下放标记,但没必要向上更新 线段:自带的,不用建模 区间和性质:sum: /* WA 1次 ...

  5. 【构造】Ural Championship April 30, 2017 Problem K. King’s island

    题意:让你构造一个n个点的简单多边形,使得所有点是整点,并且所有边长是整数,并且没有边平行于坐标轴. 就利用勾股数,如下图这样构造即可,n为偶数时,只需矩形拼成,n为奇数时,封上虚线边即可. #inc ...

  6. 【哈希表】Ural Championship April 30, 2017 Problem H. Hamburgers

    题意:有n群人,每个人有喜欢的汉堡配方:有m家店,给出每家店的每个汉堡的配方,如果存在某个汉堡,其配料表包含某个人喜欢的配方,则这个人喜欢这个汉堡所在的店家.问你对每群人,输出被喜欢的人数最多的店面是 ...

  7. 【折半枚举】Ural Championship April 30, 2017 Problem G. Glasses with solutions

    题意:有n杯盐溶液,给定每杯里面盐的质量以及盐溶液的质量.问你有多少种方案选择一个子集,使得集合里面的盐溶液倒到一个被子里面以后,浓度为A/B. 折半枚举,暴力搜索分界线一侧的答案数,跨越分界线的答案 ...

  8. codeforce ABBYY Cup 3.0 - Finals (online version) B2. Shave Beaver! 线段树

    B2. Shave Beaver!   The Smart Beaver has recently designed and built an innovative nanotechnologic a ...

  9. XIII Open Grodno SU Championship

    A. Alice in the Wonderland 按题意模拟. #include<stdio.h> #include<iostream> #include<strin ...

随机推荐

  1. [IOS]vmxsmc.exe已停止工作 VMware11 Unlocker for Mac OSX无法使用的解决办法.

    今天我帮同事安装VMware workstation12后发现之前的unlocker已经无法进行解锁了(就是VMware新建虚拟机无App Mac选项) 使用unlocker会出现vmsxmc.exe ...

  2. https 多路复用的理解~转载

    https://segmentfault.com/q/1010000005167289 这里面的http/2连接是指tcp/ip层的连接还是http应用层(也就是我们平常在chrome F12 net ...

  3. 实战手工注入某站,mssql注入

    昨天就搞下来的,但是是工具搞得,为了比赛还是抛弃一阵子的工具吧.内容相对简单,可掠过. 报错得到sql语句: DataSet ds2 = BusinessLibrary.classHelper.Get ...

  4. Linux 入门记录:十八、Linux 系统启动流程 + 单用户修改 root 密码 + GRUB 加密

    一.系统启动流程 一般来说,Linux 系统的启动流程是这样的: 1. 开机之后,位于计算机主板 ROM 芯片上的 BIOS 被最先读取,在进行硬件和内存的校验以及 CPU 的自检没有异常后, BIO ...

  5. python基础===python基础知识问答(转)

    1.到底什么是Python?你可以在回答中与其他技术进行对比 Python是一种解释型语言.与C语言和C的衍生语言不同,Python代码在运行之前不需要编译.其他解释型语言还包括PHP和Ruby. P ...

  6. MVC使用Newtonsoft无需实体类,实现JSON数据返回给前端页面使用

    //引用using Newtonsoft.Json; using Newtonsoft.Json.Linq; public ActionResult JsonSample() { ResponseRe ...

  7. mysql innodb 数据表不存在

    方法一: https://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html 修改my.cnf文件 [mysqld] innodb ...

  8. display:inline、block、inline-block三者之间的区别

    1. display:block就是将元素显示为块级元素. block元素的特点: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度:(<d ...

  9. IE6下面的hover不兼容

    第一种解决方法: ie6中hover只是对a标签有作用 必须有href=“”,否则都不管用,如果不能写a标签,还想让ie6下有滑过效果,那只能写javascript或者jquery. 例如:ie6是不 ...

  10. JavaScript跨域解决方法大全

    跨域的定义:JavaScript出于安全性考虑,同源策略机制对跨域访问做了限制.域仅仅是通过“URL的首部”字符串进行识别,“URL的首部”指window.location.protocol +win ...