求助线段树样例最后一个少1,4号关注回报
查看原帖
求助线段树样例最后一个少1,4号关注回报
347589
Zelotz楼主2021/10/18 23:40

有点累了,调不动了

线段树永远的痛,最简单的一个都爆0

#include <bits/stdc++.h>
using namespace std;
#define srand srand(time(NULL))
#define random(x) rand() % (x)
#define il inline
#define ptc putchar
#define reg register
#define mp make_pair
typedef __int128 LL;
typedef long long ll;
typedef pair<int, int> PII;
namespace cyyh {
	template <typename T>
	il void read(T &x) {
		x = 0; T f = 1; char ch;
		while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
		while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar(); x *= f;
	}
	template <typename T>
	il void write(T x) {
		if (x < 0) ptc('-'), x = -x;
		if (x > 9) write(x / 10);
		ptc(x % 10 + '0');
	}
	template <typename T>
	il T lowbit(const T &x) {
		return x & -x;
	}
}
using namespace cyyh; 
const int N = 2e5 + 5; // 2倍空间 
int n, m, tag[N], s[N];
struct node {
	int l, r;
} t[N];
void update(int l, int r, int id, int mid) { // mid用于更新儿子区间
    if (!tag[id]) return ;
    tag[id << 1] += tag[id];
    tag[id << 1 | 1] += tag[id];
    s[id << 1] += tag[id] * (mid - l + 1);
    s[id << 1 | 1] += tag[id] * (r - mid);
    tag[id] = 0;
}
int add(int l, int r, int x, int y, int k, int id) { // l,r表示现在递归到的区间,x,y表示题目中要加的区间
	if (l > y || r < x) return 0;
	if (l >= x && r <= y) { // 完全覆盖,直接加上标记和值
		tag[id] += k;
		s[id] += (r - l + 1) * k; // 注意是加上当前区间的和
		return s[id];
	}
	int mid = l + r >> 1;
    update(l, r, id, mid);
    s[id] = add(l, mid, x, y, k, id << 1) + add(mid + 1, r, x, y, k, id << 1 | 1);
    return s[id];
} 
int get(int l, int r, int x, int y, int id) {
    if (l > y || r < x) return 0;
    if (l >= x && r <= y) return s[id];
    int mid = l + r >> 1;
    update(l, r, id, mid);
    return get(l, mid, x, y, id << 1) + get(mid + 1, r, x, y, id << 1 | 1);
}
int main() {
	read(n), read(m);
	for (int i = 1; i <= n; ++i) {
		int x;
		read(x);
        add(1, n, i, i, x, 1);
	}
    for (int i = 1; i <= m; ++i) {
        int op, x, y, k;
        read(op);
        if (op == 1) {
            read(x), read(y), read(k);
            add(1, n, x, y, k, 1);
        } else {
            read(x), read(y);
            write(get(1, n, x, y, 1)), ptc('\n');
        }        
    }
	return 0;
}

可能要去睡了,明天我回来看的QwQ

2021/10/18 23:40
加载中...