萌新求助线段树,被编译器揍得又红又紫又黑的。。

P3373 【模板】线段树 2

编译器?????????
by xiaoyaowudi @ 2020-04-26 17:11:00


您CE了??????
by xiaoyaowudi @ 2020-04-26 17:11:19


码风太丑了别介意qwq
by bovine__kebi @ 2020-04-26 17:11:34


编译器可海星
by 小恐 @ 2020-04-26 17:11:44


@[xiaoyaowudi](/user/151623) 不是。。。是WA+RE+TLE,可能我说的有问题。。。
by bovine__kebi @ 2020-04-26 17:11:57


先pushdown再更新tag
by xiaoyaowudi @ 2020-04-26 17:14:01


@[xiaoyaowudi](/user/151623) 我去试试
by bovine__kebi @ 2020-04-26 17:14:37


@[xiaoyaowudi](/user/151623) 然而还是不对。。。
by bovine__kebi @ 2020-04-26 17:16:15


@[bovine__kebi](/user/294736) 大概是%不完全 给份代码 ```cpp #include<cstdio> #include<iostream> #include<cstring> #define lc(k) k << 1 #define rc(k) k << 1 | 1 const int MAXN = 100001; inline int read() { int x = 0;char ch = getchar(); while(ch > '9' || ch < '0') ch = getchar(); do x = x * 10 + ch - 48,ch = getchar();while(ch >= '0' && ch <= '9'); return x; } inline void print(const long long &x) { if(x > 9) print(x / 10ll); std::putchar(x % 10 + 48ll); } int n,m,p; long long sum[MAXN << 2],plus[MAXN << 2],times[MAXN << 2]; void PrintPlus(int k,int l,int r,int v) { sum[k] = (sum[k] + (r - l + 1) * 1ll * v) % p; plus[k] = (plus[k] + v) % p; } void PrintTimes(int k,int v) { sum[k] = sum[k] * 1ll * v % p; plus[k] = plus[k] * 1ll * v % p; times[k] = times[k] * 1ll * v % p; } void PushDown(int k,int l,int r) { int mid = (l + r) >> 1; PrintTimes(lc(k),times[k]); PrintPlus(lc(k),l,mid,plus[k]); PrintTimes(rc(k),times[k]); PrintPlus(rc(k),mid + 1,r,plus[k]); times[k] = 1, plus[k] = 0; } void PushUp(int k) { sum[k] = (sum[lc(k)] + sum[rc(k)]) % p; } void Build(int k,int l,int r) { times[k] = 1; plus[k] = 0; if(l == r) { sum[k] = read() % p; return; } int mid = (l + r) >> 1; Build(lc(k),l,mid); Build(rc(k),mid + 1,r); PushUp(k); return; } void UpdatePlus(int k,int l,int r,int x,int y,int v) { if(l > y || r < x) return; if(l >= x && r <= y) { PrintPlus(k,l,r,v); return; } int mid = (l + r) >> 1; PushDown(k,l,r); UpdatePlus(lc(k),l,mid,x,y,v); UpdatePlus(rc(k),mid + 1,r,x,y,v); PushUp(k); return; } void UpdateTimes(int k,int l,int r,int x,int y,int v) { if(l > y || r < x) return; if(l >= x && r <= y) { PrintTimes(k,v); return; } int mid = (l + r) >> 1; PushDown(k,l,r); UpdateTimes(lc(k),l,mid,x,y,v); UpdateTimes(rc(k),mid + 1,r,x,y,v); PushUp(k); return; } long long Query(int k,int l,int r,int x,int y) { if(l > y || r < x) return 0ll; if(l >= x && r <= y) return sum[k]; int mid = (l + r) >> 1; PushDown(k,l,r); return (Query(lc(k),l,mid,x,y) + Query(rc(k),mid + 1,r,x,y)) % p; } int main() { n = read(), m = read(), p = read(); Build(1,1,n); int op,l,r,x; while(m--) { op = read(); l = read(), r = read(); //for(int i = 1;i <= 15;i++) std::printf("%d ",sum[i]); //std::putchar('\n'); //for(int i = 1;i <= 15;i++) std::printf("%d ",plus[i]); //std::putchar('\n'); //for(int i = 1;i <= 15;i++) std::printf("%d ",times[i]); //std::putchar('\n'); if(op == 1) {x = read(); UpdateTimes(1,1,n,l,r,x);} if(op == 2) {x = read(); UpdatePlus(1,1,n,l,r,x);} if(op == 3) {print(Query(1,1,n,l,r) % p); std::putchar('\n');} } return 0; } ```
by Vocalise @ 2020-04-26 17:41:11


(线段树开四倍空间啊)
by StarLbright40 @ 2020-04-26 17:41:35


| 下一页