社区讨论
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 条回复,欢迎继续交流。
正在加载回复...