求助!!!不知道哪里错了。T_T
  • 板块学术版
  • 楼主_shy
  • 当前回复9
  • 已保存回复9
  • 发布时间2020/8/30 00:58
  • 上次更新2023/11/5 13:59:18
查看原帖
求助!!!不知道哪里错了。T_T
183881
_shy楼主2020/8/30 00:58

线段树2```cpp include #include #include #include #include #include #include #include #include #include #include using namespace std; const int maxn = 100100; int n, m, p, flag , x, y; long long ip[maxn], k; struct worker {long long sum, mul, add; int l, r;} tree[maxn << 2]; void build (int i, int l, int r) { tree[i].add = 0; tree[i].mul = 1; tree[i].l = l; tree[i].r = r; if (l == r) {tree[i].sum = ip[l] % p; return;} int mid = (l + r) >> 1; build (i << 1, l, mid); build ((i << 1) + 1, mid + 1, r); tree[i].sum = (tree[i << 1].sum + tree[(i << 1) + 1].sum) % p; return; } void push_down (int i) { tree[i << 1].mul = (tree[i << 1].mul * tree[i].mul) % p; tree[(i << 1) + 1].mul = (tree[(i << 1) + 1].mul * tree[i].mul) % p; tree[i << 1].add = (tree[i << 1].add + tree[i].add) % p; tree[(i << 1) + 1].add = (tree[(i << 1) + 1].add + tree[i].add) % p; tree[i << 1].sum = (tree[i << 1].sum * tree[i].mul + (tree[i << 1].r - tree[i << 1].l + 1) * tree[i].add) % p; tree[(i << 1) + 1].sum = (tree[(i << 1) + 1].sum * tree[i].mul + (tree[(i << 1) + 1].r - tree[(i << 1) + 1].l + 1) * tree[i].add) % p; tree[i].mul = 1; tree[i].add = 0; return; } void update_add (int i, int l, int r, long long c) { if (tree[i].r < l || tree[i].l > r) return; if (tree[i].l >= l && tree[i].r <= r) {tree[i].add = (tree[i].add + c) % p; tree[i].sum = (tree[i].sum + c * (tree[i].r - tree[i].l + 1)) % p; return;} push_down (i); if (tree[i << 1].r >= l) update_add (i << 1, l, r, c); if (tree[(i << 1) + 1].l <= r) update_add ((i << 1) + 1, l, r, c); tree[i].sum = (tree[i << 1].sum + tree[(i << 1) + 1].sum) % p; } void update_mul (int i, int l, int r, long long c) { if (tree[i].l > r || tree[i].r < l) return; if (tree[i].l >= l && tree[i].r <= r) {tree[i].mul = (tree[i].mul * c) % p; tree[i].add = (tree[i].add * c) % p; tree[i].sum = (tree[i].sum * c) % p; return;} push_down (i); if (tree[i << 1].r >= l) update_mul (i << 1, l, r, c); if (tree[(i << 1) + 1].l <= r) update_mul ((i << 1) + 1, l, r, c); tree[i].sum = (tree[(i << 1) + 1].sum + tree[i << 1].sum) % p; } long long ask (int i, int l, int r) { if (tree[i].l > r || tree[i].r < l) return 0; if (tree[i].l >= l && tree[i].r <= r) return tree[i].sum % p; push_down (i); long long s = 0; if (tree[i << 1].r >= l) s = (s + ask (i << 1, l, r)) % p; if (tree[(i << 1) + 1].l <= r) s = (s + ask ((i << 1) + 1, l, r)) % p; return s; } int main () { scanf ("%d %d %d", &n, &m, &p); for (int i = 1; i <= n; i++) scanf ("%lld", &ip[i]); build (1, 1, n); for (int i = 1; i <= m; i++) { scanf ("%d", &flag); if (flag == 1) {scanf ("%d %d %lld", &x, &y, &k); update_mul (1, x, y, k);} else if (flag == 3) {scanf ("%d %d", &x, &y); printf ("%lld\n", ask (1, x, y));} else {scanf ("%d %d %lld", &x, &y, &k); update_add (1, x, y, k);} } return 0; }

2020/8/30 00:58
加载中...