线段树求调
  • 板块学术版
  • 楼主zsyzsy_2012
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/9 16:29
  • 上次更新2023/11/3 10:54:04
查看原帖
线段树求调
717781
zsyzsy_2012楼主2023/7/9 16:29

题目

#include <bits/stdc++.h>
#define int long long
#define N 100010
using namespace std ;
int n , m , a[N] ;
struct node {
	int sum , tag1 , tag2 ;
}tree[N * 4];
int ls(int cur) {
	return (cur << 1) ;
}
int rs(int cur) {
	return (cur << 1) + 1 ;
}
void pushup(int cur) {
	tree[cur].sum = tree[ls(cur)].sum + tree[rs(cur)].sum ;
}
void build(int cur , int l , int r) {
	tree[cur].tag1 = tree[cur].tag2 = 0 ;
	if(l == r) {
		tree[cur].sum = a[l] ;
		return ;
	}
	int mid = (l + r) / 2 ;
	build(ls(cur) , l , mid) ;
	build(rs(cur) , mid + 1 , r) ;
	pushup(cur) ;
}
bool InRange(int L , int R , int l , int r) {
	return (l <= L && R <= r) ;
}
bool OutOfRange(int L , int R , int l , int r) {
	return (l > R || r < L) ;
}
int Sum(int a1 , int d , int len) {
	int an = a1 + (len - 1) * d ;
	return (a1 + an) * len / 2 ;
}
void maketag(int cur , int len , int x , int y) {
	tree[cur].sum += Sum(x , y , len) ;
	tree[cur].tag1 += x ;
	tree[cur].tag2 += y ;
}
void pushdown(int cur , int l , int r) {
	int mid = (l + r) / 2 ;
	maketag(ls(cur) , mid - l + 1 , tree[cur].tag1 , tree[cur].tag2) ;
	maketag(rs(cur) , r - mid , tree[cur].tag1 + (mid - l + 1) * tree[cur].tag2 , tree[cur].tag2) ;
	tree[cur].tag1 = tree[cur].tag2 = 0 ;
}
int query(int cur , int L , int R , int l , int r) {
	if(InRange(l , r , L , R)) {
		return tree[cur].sum ;
	}
	if(OutOfRange(l , r , L , R)) {
		return 0 ;
	}
	int mid = (l + r) / 2 ;
	pushdown(cur , l , r) ;
	return query(ls(cur) , L , R , l , mid) + query(rs(cur) , L , R , mid + 1 , r) ;
}
void update(int cur , int L , int R , int l , int r , int x , int y) {
	if(InRange(l , r , L , R)) {
		maketag(cur , r - l + 1 , x , y) ;
		return ;
	}
	if(OutOfRange(l , r , L , R)) {
		return ;
	}
	int mid = (l + r) / 2 ;
	pushdown(cur , l , r) ;
	update(ls(cur) , L , R , l , mid , x , y) ;
	update(rs(cur) , L , R , mid + 1 , r , x + y * (mid - l + 1) , y) ;
	pushup(cur) ;
}
signed main() {
	scanf("%lld%lld" , &n , &m) ;
	for(int i = 1 ; i <= n ; i++) {
		scanf("%lld" , &a[i]) ;
	}
	build(1 , 1 , n) ;
	while(m--) {
		int op , l , r , k , d , p ;
		scanf("%lld" , &op) ;
		if(op == 1) {
			scanf("%lld%lld%lld%lld" , &l , &r , &k , &d) ;
			update(1 , l , r , 1 , n , k , d) ;
		}
		else {
			scanf("%lld" , &p) ;
			printf("%lld\n" , query(1 , p , p , 1 , n)) ;
		}
	}
	return 0 ;
}

样例爆8求助,悬关

2023/7/9 16:29
加载中...