社区讨论

萌新求助大水题线段树 90分 wa在6000行

P1438无聊的数列参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@locynbml
此快照首次捕获于
2023/10/30 21:53
2 年前
此快照最后确认于
2023/11/05 08:15
2 年前
查看原帖
测评记录 不知道错了哪
CPP
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct Node{
	int l,r;
	int v,tag;
}tr[N<<2];
int w[N<<1];
void push_up(int u){
	tr[u].v=tr[u<<1|1].v+tr[u<<1].v;
}
void build(int u,int l,int r){
	tr[u]={l,r,0,0};
	if(tr[u].l==tr[u].r){
		tr[u].v=w[tr[u].r]-w[tr[u].l-1];
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	push_up(u);
}
void push_down(int u){
	if(tr[u].tag){
		tr[u<<1].tag+=tr[u].tag;
		tr[u<<1|1].tag+=tr[u].tag;
		tr[u<<1].v+=tr[u].tag*(tr[u<<1].r-tr[u<<1].l+1);
		tr[u<<1|1].v+=tr[u].tag*(tr[u<<1|1].r-tr[u<<1|1].l+1); 
		tr[u].tag=0;
	}
}

void change(int u,int l,int r,int v){
	if(l<=tr[u].l&&tr[u].r<=r){
		tr[u].v+=(tr[u].r-tr[u].l+1)*v;
		tr[u].tag+=v;
		return ;
	}
	push_down(u);
	int mid=tr[u].l+tr[u].r>>1;
	if(l<=mid)change(u<<1,l,r,v);
	if(r>mid)change(u<<1|1,l,r,v);
	push_up(u);
}
int query(int u,int l,int r){
	if(l<=tr[u].l&&tr[u].r<=r){
		return tr[u].v;
	}
	push_down(u);
	int mid=tr[u].l+tr[u].r>>1,res=0;
	if(l<=mid)res+=query(u<<1,l,r);
	if(r>mid)res+=query(u<<1|1,l,r);
	return res;
}
int n,m;
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	scanf("%d",&w[i]);
	build(1,1,n);
	int op,l,r,k,d;
	for(int i=1;i<=m;i++){
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d%d",&l,&r,&k,&d);
			change(1,l,l,k);
			change(1,l+1,r,d);
			if(r+1<=n)change(1,r+1,r+1,-1*(k+(r-l)*d));
			
		}else{
			l=1;
			scanf("%d",&r);
			printf("%d\n",query(1,1,r));
		}
	}
}

回复

6 条回复,欢迎继续交流。

正在加载回复...