社区讨论

0分,高手调调

P1438无聊的数列参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhjs3xme
此快照首次捕获于
2025/11/04 07:36
4 个月前
此快照最后确认于
2025/11/04 07:36
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 100000
struct node{
	ll date, lazy;
};
node tree[4*maxn+10];
ll date[maxn+10];
int n,m;
void creattree(int left,int right,int pos){
	if(left == right){
		tree[pos].date = date[left];
		return;
	}
	int mid = (left + right) / 2;
	creattree(left, mid, pos*2);
	creattree(mid+1, right, pos*2+1);
	tree[pos].date = tree[pos*2].date + tree[pos*2+1].date;
}
void pushdown(int pos){
	if(tree[pos].lazy != 0){
		tree[pos*2].date += tree[pos].lazy;
		tree[pos*2+1].date += tree[pos].lazy;
		tree[pos*2].lazy += tree[pos].lazy;
		tree[pos*2+1].lazy += tree[pos].lazy;
		tree[pos].lazy = 0;
	}
}
void update(int left,int right,int l,int r,int pos,int ans){
	if(left > r || right < l ){
		return ;
	}
	if(left >= l && right <= r){
		tree[pos].lazy += ans;
		tree[pos].date += ans;
		return ;
	}
	int mid = (left + right) / 2;
	pushdown(pos);
	update(left, mid, l , r, pos*2, ans);
	update(mid+1, right, l , r, pos*2+1, ans);
	tree[pos].date = tree[pos*2].date + tree[pos*2+1].date;
}
ll findsum(int left,int right,int l,int r,int pos){
	if(left > r || right < l ){
		return 0;
	}
	if(left >= l && right <= r){
		return tree[pos].date;
	}
	int mid = (left + right) / 2;
	pushdown(pos);
	int leftsum = findsum(left, mid, l , r, pos*2);
	int rightsum = findsum(mid+1, right, l , r, pos*2+1);
	return leftsum + rightsum;
}
int main(){
	cin >> n >> m;
	for(int i=1; i<=n; i++){
		cin >> date[i];
	}
	for(int i=n;i>1;i--){
		date[i] -= date[i-1]; 
	}
	creattree(1,n,1);
	while(m--){
		int a;
		cin >> a;
		if(a == 1){
			int b,c;
			ll d,e;
			cin >> b >> c >> d >> e;
			update(1,n,b+1,c,1,e);
			update(1,n,b,b,1,d);
			update(1,n,c+1,c+1,1,-(d*(c-b) + e));
		}else{
			int pos;
			cin >> pos;
			cout << findsum(1,n,1,pos,1);
		}
	}
	return 0;
}

回复

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

正在加载回复...