线段树求调,玄关

P1253 扶苏的问题

60pts,最后一个点超时,七八九测试点WA
by lwxxs @ 2024-04-05 13:24:45


@[lwxxs](/user/995853) 你这线段树是不是写复杂了 模版,~~我不知道要不要改~~ ``` void pushup(int k){ sum[k] = sum[k << 1] + sum[k << 1 | 1]; return ; } void build(int k,int l,int r){ if(l == r){ sum[k] = a[l]; return ; } int mid = (l + r) >> 1; build(k << 1,l,mid); build(k << 1 | 1,mid + 1,r); pushup(k); return ; } void change(int k,int l,int r,int v){ sum[k] += (ll)v * (r - l + 1); add[k] += v; return ; } void pushdown(int k,int l,int r){ if(add[k]){ int mid = (l + r) >> 1; change(k << 1,l,mid,add[k]); change(k << 1 | 1,mid + 1,r,add[k]); add[k] = 0; } return ; } void update(int k,int l,int r,int x,int y,int v){ if(l >= x && r <= y){ change(k,l,r,v); return ; } pushdown(k,l,r); int mid = (l + r) >> 1; if(x <= mid) update(k << 1,l,mid,x,y,v); if(y >= mid + 1) update(k << 1 | 1,mid + 1,r,x,y,v); pushup(k); return ; } ll query(int k,int l,int r,int x,int y){ if(l >= x && r <= y) return sum[k]; pushdown(k,l,r); int mid = (l + r) >> 1; ll res = 0; if(x <= mid) res = query(k << 1,l,mid,x,y); if(y >= mid + 1) res += query(k << 1 | 1,mid + 1,r,x,y); return res; } ```
by wrh316 @ 2024-04-05 14:17:20


@[lwxxs](/user/995853) 两个错误: 1. pushdown函数里面有一个`=`打成了`+=`。 ```cpp if(tr[u<<1|1].reset!=inf){ tr[u<<1|1].reset+=tr[u].add; tr[u<<1|1].maxv+=tr[u<<1|1].reset;//here } ``` 2. reset 也要用 long long ```cpp ll add; int reset;//here ll maxv; ```
by Leo_SZ @ 2024-04-05 21:47:16


对于超时,题目已经提示:请注意大量数据读入对程序效率造成的影响。所以请将 cin 换成 scanf 或快读。
by Leo_SZ @ 2024-04-05 22:53:55


@[Leo_SZ](/user/258520) 感谢大佬,已关
by lwxxs @ 2024-04-06 18:51:20


此贴完结
by lwxxs @ 2024-04-06 18:51:58


|