给出一个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. Android概述(思维导图)

  2. IOS请求H5页面、要求自定义agent判断是电脑、安卓还是iPhone登录

    //自定制的userAgent- (void)createMyAgent{        NSString *userAgent = [[[UIWebView alloc]init]stringByE ...

  3. poj3259 最短路判环

    题意:有一些点.一些道路和一些虫洞,道路是双向的,连接两点,花费正的时间,而虫洞是单向的,连接两点,可以使时间倒退,求是否能够回到过去. 只要明确回到过去其实就是当出现一个负环的时候,不断沿这个环走, ...

  4. java计算文件32位md5值

    protected static String getFileMD5(String fileName) { File file = new File(fileName); if(!file.exist ...

  5. RecyclerView使用完全解析

    http://blog.csdn.net/a396901990/article/details/40153759 Android RecyclerView 使用完全解析 体验艺术般的控件 通过这个控件 ...

  6. 论文笔记之:Spatially Supervised Recurrent Convolutional Neural Networks for Visual Object Tracking

    Spatially Supervised Recurrent Convolutional Neural Networks for Visual Object Tracking  arXiv Paper ...

  7. 论文笔记之:Multiple Object Recognition With Visual Attention

     Multiple Object Recognition With Visual Attention Google DeepMind  ICRL 2015 本文提出了一种基于 attention 的用 ...

  8. freeswitch 1.4

    yum install git gcc-c++ autoconf automake libtool wget python ncurses-devel zlib-devel libjpeg-devel ...

  9. MySQL-负载很高排查思路

    工欲善其事必先利其器,我说一下思路 思路:1.确定高负载的类型 htop,dstat命令看负载高是CPU还是IO2.监控具体的sql语句,是insert update 还是 delete导致高负载3. ...

  10. Caffe-windows上训练自己的数据

    1.数据获取 在网上选择特定类别,下载相应的若干张图片.可以网页另存或者图片下载器.本例中保存了小狗.菊花.梅花三类各两百多张. 2.重命名 import os import os.path root ...