社区讨论

90求条

P5459[BJOI2016] 回转寿司参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mj8daibr
此快照首次捕获于
2025/12/16 17:15
2 个月前
此快照最后确认于
2025/12/19 18:25
2 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int MAXN = 3.4e6 + 15;
int root = 1, pre[MAXN];
const int INF = 1e10;

int MOD = 1e9 + 7;

namespace sgt{
    int ID = 0;

    struct Node{
        int tag, sum, l, r;
        Node () {
            tag = 0, sum = 0, l = r = 0;
        }
    } t[8000005]; 

    void merge(int id){
        if(t[id].l == 0) t[id].l = ++ ID;
        if(t[id].r == 0) t[id].r = ++ ID;
        t[id].sum = (t[t[id].l].sum + t[t[id].r].sum) % MOD;
    }

    void push_down(int id, int cl, int cr){
        if(t[id].l == 0) t[id].l = ++ ID;
        if(t[id].r == 0) t[id].r = ++ ID;
        int lid = t[id].l, rid = t[id].r;
        int mid = (cl + cr) >> 1;
        int len_l = mid - cl + 1;
        int len_r = cr - mid;
        t[id].tag = (t[id].tag % MOD + MOD) % MOD;
        t[lid].tag = (t[lid].tag + t[id].tag) % MOD;
        t[rid].tag = (t[rid].tag + t[id].tag) % MOD;
        t[lid].sum = (t[lid].sum + 1LL * len_l * t[id].tag) % MOD;
        t[rid].sum = (t[rid].sum + 1LL * len_r * t[id].tag) % MOD;
        t[id].tag = 0;
    }

    int qry(int l, int r, int &id, int cl = -INF, int cr = INF){
        if(id == 0) id = ++ ID;
        if (l <= cl && cr <= r){
            return (t[id].sum % MOD + MOD) % MOD; 
        }
        push_down(id, cl, cr);
        int mid = cl + cr >> 1;
        if(mid >= r) {
            return qry(l, r, t[id].l, cl, mid);
        } else if(mid < l) {
            return qry(l, r, t[id].r, mid + 1, cr);
        } else {
            return (qry(l, r, t[id].l, cl, mid) + qry(l, r, t[id].r, mid + 1, cr)) % MOD;
        }
    }

    void modify(int l, int r, int x, int &id, int cl = -INF, int cr = INF){
        if(id == 0) id = ++ ID;
        if (l <= cl && cr <= r){
            x = (x % MOD + MOD) % MOD;
            t[id].tag = (t[id].tag + x) % MOD;
            t[id].sum = (t[id].sum + 1LL * (cr - cl + 1) * x) % MOD;
            return ;
        }
        push_down(id, cl, cr);
        int mid = cl + cr >> 1;
        if(mid >= r) {
            modify(l, r, x, t[id].l, cl, mid);
        } else if(mid < l) {
            modify(l, r, x, t[id].r, mid + 1, cr);
        } else {
            modify(l, r, x, t[id].l, cl, mid);
            modify(l, r, x, t[id].r, mid + 1, cr);
        }
        merge(id);
    }
}

inline int read() {
	int x = 0,flag = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){if(ch == '-')flag = -1;ch = getchar();}
	while(ch >='0' && ch <='9'){x = (x << 3) + (x << 1) + ch - 48;ch = getchar();}
	return x * flag;
}

signed main(){
    ios::sync_with_stdio(false), cin.tie(0);
    int n, l, r; cin >> n >> l >> r;
	for(int i = 1, x; i <= n; i ++) {
		cin >> x;
		pre[i] = pre[i - 1] + x;
	}
	root = 1;
	sgt::modify(0,0, 1,root);
    int res = 0;
	for(int i = 1; i <= n; i++) {
		res += sgt::qry(pre[i] - r, pre[i] - l, root);
		sgt::modify(pre[i], pre[i], 1, root);
	}
	cout << res << "\n";
    return 0;
} // ??love luogu

回复

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

正在加载回复...