社区讨论

线段树做法只有5分,求助

P1083[NOIP 2012 提高组] 借教室参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mi7ckfc3
此快照首次捕获于
2025/11/20 19:27
4 个月前
此快照最后确认于
2025/11/20 19:27
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define re register
#define lson o << 1
#define rson o << 1 | 1
using namespace std;
typedef long long ll;
const int N = 1000005;
int n, m;
ll sum, ans;
inline int read(){
	int f = 0, x = 0; char ch;
	do {ch = getchar(); f |= ch == '-';} while (!isdigit(ch));
	do {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();} while (isdigit(ch));
	return f ? -x : x;
}
struct Segment_Tree{
    static const int BASE = 1000000;
    ll tree[BASE << 2 | 3], lazy[BASE << 2 | 3];
    inline void pushup(int o){
        tree[o] = tree[lson] + tree[rson];
    }
    inline void build(int l, int r, int o){
        if (l == r){
            tree[o] = read();
            return;
        }
        int mid = (l + r) >> 1;
        build(l, mid, lson);
        build(mid + 1, r, rson);
        pushup(o);
    }
    inline void pushdown(int o, int cl, int cr){
        if (lazy[o]){
            lazy[lson] += lazy[o];
            lazy[rson] += lazy[o];
            tree[lson] += cl * lazy[o];
            tree[rson] += cr * lazy[o];
            lazy[o] = 0;
        }
    }
    inline void modify(int l, int r, int ql, int qr, int val, int o){
        if (ql <= l && r <= qr){
            tree[o] += (r - l + 1) * val;
            lazy[o] += val;
            return;
        }
        int mid = (l + r) >> 1;
        pushdown(o, mid - l + 1, r - mid);
        if (ql <= mid)modify(l, mid, ql, qr, val, lson);
        if (qr > mid)modify(mid + 1, r, ql, qr, val, rson);
        pushup(o);
    }
    inline ll querysum(int l, int r, int ql, int qr, int o){
        if (ql <= l && r <= qr){
            return tree[o];
        }
        ll mid = (l + r) >> 1, ans = 0;
        pushdown(o, mid - l + 1, r - mid);
        if (ql <= mid)ans += querysum(l, mid, ql, qr, lson);
        if (qr > mid)ans += querysum(mid + 1, r, ql, qr, rson);
        return ans;
    }
}T;
int main(){
	//freopen("testdata.txt", "r", stdin);
	n = read(), m = read();
	T.build(1, n, 1);
	for (re int i = 1; i <= m; ++i){
		int d = read(), s = read(), t = read();
		T.modify(1, n, s, t, -d, 1);
		//cout << T.tree[1] << ' ';
		if (T.tree[1] < 0){
			puts("-1");
			printf("%d", i);
			return 0;
		}
	}
	puts("0");
	return 0;
} 
请问各位大佬为什么这样只有5分,我看题解里面有个大佬是直接查询根节点还是只有五分。。。求大佬指点,万分感谢

回复

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

正在加载回复...