给出一个n个元素的序列,序列有正数也有负数

支持3个操作:

p x y

0.p=0时,把第x个的值改为y

1.p=1时,交换第x个和第y个的值

2.p=2时,问区间[x,y]里面连续k个的子序列的最大和(保证y-x+1>=k)

我们只要定义数组v

v[i]表示原序列中,从第i个开始,连续k个元素的值的和

然后我们只需要维护一棵线段树,树的叶子节点表示数组v

树的节点维护:

区间[l,r]中,连续k个的子序列的最大和,即数组v的最大值

这样的话,3个操作就变为:

0.把区间[max(x-k+1,0),x]的值加y-init_v[x]

1.区间[max(x-k+1,0),x]加上init_v[y]-init_v[x]

 区间[max(y-k+1,0),y]加上init_v[x]-init_v[y]

 交换init_v[x]和init_v[y]的值

2.求max[x,y-k+1]

 #include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; #define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 const int maxn=+;
const int inf=0x3f3f3f3f; int init_v[maxn];
int init_sum[maxn];
int v[maxn<<];
int lazy[maxn<<];
int n,m,k; void solve(); int main()
{
int test;
scanf("%d",&test);
while(test--){
scanf("%d %d %d",&n,&m,&k);
for(int i=;i<=n;i++){
scanf("%d",&init_v[i]);
}
solve();
}
return ;
} void pushup(int rt)
{
v[rt]=max(v[rt<<],v[rt<<|]);
} void pushdown(int rt)
{
if(lazy[rt]){
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
v[rt<<]+=lazy[rt];
v[rt<<|]+=lazy[rt];
lazy[rt]=;
}
} void build(int l,int r,int rt)
{
if(l==r){
v[rt]=init_sum[l+k-]-init_sum[l-];
return ;
}
int m=(l+r)>>;
build(lson);
build(rson);
pushup(rt);
} void update(int L,int R,int add,int l,int r,int rt)
{
if(L<=l&&R>=r){
lazy[rt]+=add;
v[rt]+=add;
return ;
}
int m=(l+r)>>;
pushdown(rt);
if(L<=m)
update(L,R,add,lson);
if(R>m)
update(L,R,add,rson);
pushup(rt);
} int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r){
return v[rt];
}
int m=(l+r)>>;
pushdown(rt);
int ret=-inf;
if(L<=m)
ret=max(ret,query(L,R,lson));
if(R>m)
ret=max(ret,query(L,R,rson)); return ret;
} void solve()
{
init_sum[]=;
for(int i=;i<=n;i++){
init_sum[i]=init_sum[i-]+init_v[i];
} build(,n,);
memset(lazy,,sizeof lazy);
for(int i=;i<=m;i++){
int p,x,y;
scanf("%d %d %d",&p,&x,&y);
if(p==){
update(max(x-k+,),x,y-init_v[x],,n,);
init_v[x]=y;
}
else if(p==){
update(max(x-k+,),x,init_v[y]-init_v[x],,n,);
update(max(y-k+,),y,init_v[x]-init_v[y],,n,);
swap(init_v[x],init_v[y]);
}
else{
printf("%d\n",query(x,y-k+,,n,));
}
}
return ;
}

POJ 4047 Garden 线段树 区间更新的更多相关文章

  1. POJ 2528 Mayor's posters (线段树区间更新+离散化)

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

  2. POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)

    POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...

  3. POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)

    POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...

  4. POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)

    POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...

  5. POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】

    任意门:http://poj.org/problem?id=2528 Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  6. 【POJ 2777】 Count Color(线段树区间更新与查询)

    [POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4094 ...

  7. poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 75541   ...

  8. (简单) POJ 3468 A Simple Problem with Integers , 线段树+区间更新。

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  9. POJ 3468:A Simple Problem with Integers(线段树区间更新模板)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 141093 ...

随机推荐

  1. spark_updateStateByKey

    java核心代码 JavaPairDStream<String, Integer> wordCounts = pair.updateStateByKey(new Function2< ...

  2. HDU5889 Barricade(最短路)(网络流)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  3. 【NOIP2013】华容道

    看别人的代码然后被坑了一下午+一晚上,睡一觉第二天醒悟过来打表过了 果然打表才是正确的调试方法,跟踪什么的去屎(╯‵□′)╯︵┻━┻ 原题: 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成 ...

  4. ARM1138@库函数速查

    1. GPIO库函数 可实现的功能: 获得/设置指定管脚的方向(输入.输出)和模式(硬件控制) 获取/设置指定管脚的配置(驱动强度2/4/8/8_SCmA.管脚模式:推挽(弱上拉/弱下拉)/开漏(弱上 ...

  5. git checkout 和 git checkout --merge <branch_name>使用

    一.git checkout //查看当前分支$ git branch master *t2 testing //checkout会覆盖当前工作区文件和覆盖暂存区内容,所以发现分支有未提交的警告,执行 ...

  6. treap树及相关算法

    #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string ...

  7. 【转】Python numpy库的nonzero函数用法

    当使用布尔数组直接作为下标对象或者元组下标对象中有布尔数组时,都相当于用nonzero()将布尔数组转换成一组整数数组,然后使用整数数组进行下标运算. nonzeros(a) 返回数组a中值不为零的元 ...

  8. HTML兼容性设置

    今天碰到了兼容性问题,页面显示空白,打开调试界面,显示信息 “Compatibility View because 'Display intranet sites in Compatibility V ...

  9. EDIUS如何实现抠图

    有时候我们把素材图片导入到EDIUS中会发现图片的背景有点不合适,这时候就会想替换掉这个背景.那么EDIUS也可以像PS一样替换掉背景吗?答案当然是肯定的,现在小编就带领你们一起来学习EDIUS抠图吧 ...

  10. python中时间日期格式化符号

    python中时间日期格式化符号: import time print(time.strftime('%Y%H%M%S', time.localtime())) 运行结果: 2016092308 %y ...