各位大佬,求调!!!(悬关)
查看原帖
各位大佬,求调!!!(悬关)
1286132
Baichuzhi楼主2025/1/15 12:54
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 5;
int a[N];
struct stu
{
	int left , right;
	int data , lazy;
}tree[N << 2];

void build(int l , int r , int i)
// 把区间 [l , r] 建成一棵以 i 为根节点的树 
{
	tree[i].lazy = 0; 
    tree[i].left = l; // 接管区间
    tree[i].right = r; //  接管区间
    if (l == r) // 说明变成了叶节点,递归结束条件(不写就变成死归了) 
    {
    	tree[i].data = a[i];
    	return ;
	}
	// 二分管辖区域 
    int mid = l + r >> 1;
    build(l , mid , i << 1); // 左儿子建树
    build(mid + 1 , r , i << 1 | 1); // 右儿子建树
    // 建树的方法为递归
    tree[i].data = tree[i << 1].data + tree[i << 1 | 1].data; // 赋值 
}

void pushdown(int i)
{// 向下传递 i 的 lazy 
	if (tree[i].lazy != 0)
	{
		tree[i << 1].lazy += tree[i].lazy; // lazy 向左儿子传递 
		tree[i << 1 | 1].lazy += tree[i].lazy; // lazy 向右儿子传递
		int mid = tree[i].left + tree[i].right >> 1;
		tree[i << 1].data += tree[i].lazy * (mid - tree[i << 1].left + 1);
		tree[i << 1 | 1].data += tree[i].lazy * (tree[i << 1 | 1].right - mid);
		tree[i].lazy = 0;
	}
}

int query(int l , int r , int i)
// 查询区间 [l , r],当前根节点 i 
{
	if (tree[i].left >= l && tree[i].right <= r)
	{
	/* 如果当前的状态是:
	   tree[i] .left --- l --- r --- tree[i].right, 
	   说明是包含关系,返回 i 的权值 
	*/ 
		return tree[i].data;
	}
	pushdown(i);
	int ans = 0;
	if (tree[i << i].right >= l)
	{// 左儿子和查询区有交集,递归查询左子树 
		ans += query(l , r , i << 1);
	}
	if (tree[i << 1 | 1].left <= r)
	{// 右儿子和查询区有交集,递归查询右子树 
		ans += query(l , r , i << 1 | 1);
	}
	return ans;
}

void modify(int l , int r , int k , int i)
// 修改区间 [l , r] 的值 + k,当前根节点为 i 
{
	if (tree[i].left >= l && tree[i].right <= r)
	{
		tree[i].data += k * (tree[i].right - tree[i].left + 1);
		tree[i].lazy += k;
		return ;
	}
	pushdown(i); // 向下传递
	if (tree[i << 1].right >= l)
	{
		modify(l , r , k , i << 1);
	}
	if (tree[i << 1 | 1].left <= r)
	{
		modify(l , r , k , i << 1 | 1);
	}
	tree[i].data = tree[i << 1].data + tree[i << 1 | 1].data;
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n , m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	build(1 , n , 1);
	while (m--)
	{
		int op;
		cin >> op;
		if (op == 1)
		{
			int x , y , k;
			cin >> x >> y >> k;
			modify(x , y , k , 1);
		}
		if (op == 2)
		{
			int x , y;
			cin >> x >> y;
			cout << query(x , y , 1) << endl;
		}
	}
	return 0;
}
2025/1/15 12:54
加载中...