POJ 4047 Garden 线段树 区间更新
给出一个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 线段树 区间更新的更多相关文章
- POJ 2528 Mayor's posters (线段树区间更新+离散化)
题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)
POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...
- POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】
任意门:http://poj.org/problem?id=2528 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total S ...
- 【POJ 2777】 Count Color(线段树区间更新与查询)
[POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4094 ...
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- (简单) 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 ...
- POJ 3468:A Simple Problem with Integers(线段树区间更新模板)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 141093 ...
随机推荐
- Hive不支持非相等的join
由于 hive 与传统关系型数据库面对的业务场景及底层技术架构都有着很大差异,因此,传统数据库领域的一些技能放到 Hive 中可能已不再适用.关于 hive 的优化与原理.应用的文章,前面也陆陆续续的 ...
- UVALive-4670 Dominating Patterns(AC自动机)
题目大意:找出出现次数最多的模式串. 题目分析:AC自动机裸题. 代码如下: # include<iostream> # include<cstdio> # include&l ...
- linux内核启动流程[转]
启动流程一览 既然启动是很严肃的一件事,那我们就来了解一下整个启动的过程吧! 好让大家比较容易发现启动过程里面可能会发生问题的地方,以及出现问题后的解决之道! 不过,由於启动的过程中,那个启动管理程序 ...
- Linux磁盘空间被未知资源耗尽【转】
Linux磁盘空间被未知资源耗尽 在linux中,当我们使用rm在linux上删除了大文件,但是如果有进程打开了这个大文件,却没有关闭这个文件的句柄,那么linux内核还是不会释放这个文件的磁盘空间, ...
- 查找目录下的所有文件中是否含有某个字符串 linux
查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xar ...
- FileReader/FileWriter复制文件
public class Test{ /*FileReader/FileWriter读写乱码,待处理*/ public static void main(String[] args) throws I ...
- java DecimalFormat
public class Test{ public static void main(String[] args) throws Exception{ /*DecimalFormat参数,如果是0则会 ...
- 出现Fatal IO error 11 (资源暂时不可用) on X server :0.0.的可能原因及解决方案
我在使用python的过程当中发现了这个有这样的错误,后来看了下面这篇文档才知道原因所在. 最近在编写一个局域网的聊天工具,在编写客户端时,我把界面部分和事件处理函数写好后,准备再开一个线程用于接收服 ...
- C# waitformultipleobjects()
class WatchThread { [DllImport("kernel32.dll")] private static extern int CreateEvent(IntP ...
- linux如何查看磁盘剩余空间
[root@Linux var]# df -hl 文件系统 容量 已用 可用 已用% 挂载点 /dev/hdb2 75G 75G 0 100% / /dev/hdb1 99M 9.2M 85M 10% ...