社区讨论
线段树模板求调
学术版参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m2kcn7rt
- 此快照首次捕获于
- 2024/10/22 19:15 去年
- 此快照最后确认于
- 2025/11/04 16:31 4 个月前
rt,3WA 7TLE
CPP#include<iostream>
#include<cmath>
#include<algorithm>
#define b0fitn for(int i=0;i<n;i++)
#define b1fitn for(int i=1;i<=n;i++)
using namespace std;
struct Node
{
int sum = 0, tag1 = 0, tag2 = 1;
};
const int MAXN = 1e5+55;
int n, modb, op, t, g, c, m, nums[MAXN];
Node tree[MAXN*4];
inline int ls(int x)
{
return x >> 1;
}
inline int rs(int x)
{
return (x >> 1) | 1;
}
void pushup(int p)
{
tree[p].sum = (tree[ls(p)].sum + tree[rs(p)].sum) % modb;
}
void func(int l, int r, int p, int fa)
{
tree[p].sum = (tree[p].sum * tree[fa].tag2 + tree[fa].tag1 * (r-l+1)) % modb;
tree[p].tag1 = (tree[p].tag1 + tree[fa].tag1) % modb;
tree[p].tag2 = (tree[p].tag2 * tree[fa].tag2) % modb;
}
void pushdown(int l, int r, int p)
{
int mid = (l+r) / 2;
func(l, mid, ls(p), p);
func(mid+1, r, rs(p), p);
tree[p].tag1 = 0, tree[p].tag2 = 1;
}
void build(int l, int r, int p)
{
if(l == r)
{
tree[p].sum = (nums[l]) % modb;
return;
}
int mid = (l+r) / 2;
build(l, mid, ls(p));
build(mid+1, r, rs(p));
pushup(p);
}
int query(int x, int y, int l, int r, int p)
{
if(x <= l && r <= y)
{
return tree[p].sum % modb;
}
int mid = (l+r) / 2, res = 0;
pushdown(l, r, p);
if(x <= mid) res += query(x, y, l, mid, ls(p));
if(y > mid) res += query(x, y, mid+1, r, rs(p));
pushup(p);
return res;
}
void _plus(int x, int y, int k, int l, int r, int p)
{
if(x <= l && r <= y)
{
tree[p].tag1 = (tree[p].tag1 + k) % modb;
tree[p].sum = (tree[p].sum + k * (r-l+1)) % modb;
return;
}
int mid = (l+r) / 2;
pushdown(l, r, p);
if(x <= mid) _plus(x, y, k, l, mid, ls(p));
if(y > mid) _plus(x, y, k, mid+1, r, rs(p));
pushup(p);
}
void multi(int x, int y, int k, int l, int r, int p)
{
if(x <= l && r <= y)
{
tree[p].tag2 = (tree[p].tag2 * k) % modb;
tree[p].tag1 = (tree[p].tag1 * k) % modb;
tree[p].sum = (tree[p].sum * k) % modb;
return;
}
int mid = (l+r) / 2;
pushdown(l, r, p);
if(x <= mid) multi(x, y, k, l, mid, ls(p));
if(y > mid) multi(x, y, k, mid+1, r, rs(p));
pushup(p);
}
void solve(int op)
{
build(1, n, 1);
if(op == 1)
{
cin >> t >> g >> c;
multi(t, g, c, 1, n, 1);
}
if(op == 2)
{
cin >> t >> g >> c;
_plus(t, g, c, 1, n, 1);
}
if(op == 3)
{
cin >> t >> g;
cout << query(t, g, 1, n, 1) % modb << endl;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> modb;
b1fitn cin >> nums[i];
cin >> m;
while(m--)
{
cin >> op;
solve(op);
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...