首页 技术 正文
技术 2022年11月15日
0 收藏 539 点赞 4,774 浏览 1841 个字

给出一个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 ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,565
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,413
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,186
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905