社区讨论
9分求调 差分线段树
P1438无聊的数列参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lz0ym11g
- 此快照首次捕获于
- 2024/07/25 15:36 2 年前
- 此快照最后确认于
- 2024/07/25 16:22 2 年前
CPP
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
#define root 1,1,n
#define lson ls(pos),nl,m
#define rson rs(pos),m+1,nr
int n,m,a[MAXN],op;
struct mtree{
int l,r;
long long sum,tag;
bool istag;
}t[MAXN*4];
int ls(int pos){return pos<<1;}
int rs(int pos){return pos<<1|1;}
int len(int l,int r){return r-l+1;}
inline void pushup(int pos){t[pos].sum=t[ls(pos)].sum+t[rs(pos)].sum;}
inline void pushdown(int pos){
if (t[pos].istag){
t[ls(pos)].istag=t[rs(pos)].istag=t[pos].istag;
t[ls(pos)].tag+=t[pos].tag;
t[rs(pos)].tag+=t[pos].tag;
t[ls(pos)].sum+=len(t[ls(pos)].l,t[ls(pos)].r)*t[pos].tag;
t[rs(pos)].sum+=len(t[rs(pos)].l,t[rs(pos)].r)*t[pos].tag;
t[pos].tag=0,t[pos].istag=false;
}
}
void tree_build(int pos,int nl,int nr){
t[pos].l=nl,t[pos].r=nr,t[pos].istag=false,t[pos].tag=t[pos].sum=0;
if (nl==nr){
t[pos].sum=a[nl];
return;
}
int m=(nl+nr)>>1;
tree_build(lson);
tree_build(rson);
pushup(pos);
}
void tree_change(int pos,int nl,int nr,int l,int r,long long k){
if (l<=nl&&nr<=r){
t[pos].istag=true,t[pos].tag=k,t[pos].sum+=k*len(nl,nr);
return;
}
int m=(nl+nr)>>1;
pushdown(pos);
if (l<=m) tree_change(lson,l,r,k);
if (m<r) tree_change(rson,l,r,k);
pushup(pos);
}
long long tree_query(int pos,int nl,int nr,int l,int r){
if (l<=nl&&nr<=r) return t[pos].sum;
int m=(nl+nr)>>1;
pushdown(pos);
long long res=0;
if (l<=m) res+=tree_query(lson,l,r);
if (m<r) res+=tree_query(rson,l,r);
return res;
}
int main(){
scanf ("%d%d",&n,&m);
for (int i = 1;i <= n;i ++) scanf ("%d",&a[i]);
for(int i = n;i > 0 ; i --) a[i]=a[i]-a[i-1];
tree_build(root);
int l,r,k,d,p;
for (int i = 1;i <= m;i ++){
scanf ("%d",&op);
if (op==1){
scanf ("%d%d%d%d",&l,&r,&k,&d);
if (l+1<=r) tree_change(root,l+1,r,d);
tree_change(root,l,l,k);
if (r+1<=n) tree_change(root,r+1,r+1,-(k+d*(r-l)));
}else{
scanf ("%d",&p);
printf ("%lld\n",tree_query(root,1,p));
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...