这个线段树有问题吗?TLE求助

学术版

@[CrazyProgrammer](/user/914391) 您要不要参考一下我写的 ```cpp /* Author:Kevin Z K Y temp */ #include <bits/stdc++.h> #define putendl putchar('\n') #define putspace putchar(' ') #define rep(f,a) for(auto (f):(a)) #define up(a,b,c) for(int (a)=(b);(a)<=(c);(a)++) #define dn(a,b,c) for(int (a)=(b);(a)>=(c);(a)--) using namespace std; using vi = vector<int> ; using ll = long long ; using hint = __int128 ; using PII = pair<int,int> ; using PLL = pair<ll,ll> ; const double eps=1e-6; const int N=1e5+5; struct segment_tree{ int s[(N<<2)],t[(N<<2)]; #define mid ((l+r)/2) int ls(int x){return x*2;} int rs(int x){return x*2+1;} void push_up(int p){s[p]=s[ls(p)]+s[rs(p)];} void add_tag(int l,int r,int x,int p){s[p]+=(1ll*r-l+1)*x;t[p]+=x;} void push_down(int l,int r,int p){ if(t[p]==0)return ; add_tag(l,mid,t[p],ls(p));add_tag(mid+1,r,t[p],rs(p)); t[p]=0; } void build(int l,int r,int p){ if(l==r){ int x=readi(); s[p]=x; t[p]=0; return ; } build(l,mid,ls(p));build(mid+1,r,rs(p)); push_up(p); } void add(int l,int r,int L,int R,int x,int p){ if(r<L||l>R)return ; if(l>=L&&r<=R){ add_tag(l,r,x,p); return ; } push_down(l,r,p); add(l,mid,L,R,x,ls(p));add(mid+1,r,L,R,x,rs(p)); push_up(p); } int ask(int l,int r,int L,int R,int p){ if(r<L||l>R)return 0; if(l>=L&&r<=R)return s[p]; push_down(l,r,p); return ask(l,mid,L,R,ls(p))+ask(mid+1,r,L,R,rs(p)); } #undef mid }; int main(){ ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); return 0; } ```
by kevinZ99 @ 2024-04-13 11:40:43


@[kevinZ99](/user/1117080) 谢谢,但是一个~~睿智的~~人工智能帮我找出来了
by CrazyProgrammer @ 2024-04-13 11:42:06


@[CrazyProgrammer](/user/914391) 常数问题。 线段树在递归后判定是否 return 不如直接在递归前判断。 具体的,我改了您的 update 和 query 部分的代码,如下。 ```cpp void change(int p,int l,int r,int x,int y,int v){ if((l>y&&r<x)||l>r)return; if(l>=x&&r<=y){ s[p]+=(r-l+1)*v; add[p]+=v; return; } int m=(l+r)/2; push_down(p,l,r); if(m>=x) { change(p*2,l,m,x,y,v); } if(m+1<=y) { change(p*2+1,m+1,r,x,y,v); } s[p]=s[p*2]+s[p*2+1]; return; } int getsum(int p,int l,int r,int x,int y){ if(l>y||r<x)return 0; if(l>=x&&r<=y)return s[p]; int m=(l+r)/2; push_down(p,l,r); int ans=0; if(m>=x) { ans+=getsum(p*2,l,m,x,y); } if(m+1<=y) { ans+=getsum(p*2+1,m+1,r,x,y); } return ans; } ```
by Exp10re @ 2024-04-13 11:44:35


应该是有一处 || 写成 && 了吧(
by vflower @ 2024-04-13 11:46:06


线段树可爱。 顺便一提,可以参考一下[我的马蜂](https://www.luogu.com.cn/paste/d4v5yaxl)。
by Exp10re @ 2024-04-13 11:47:03


@[vflower](/user/1000066) 乐 还真是
by Exp10re @ 2024-04-13 11:47:39


@[Exp10re](/user/403069) 谢谢,非常正确的建议 有趣的是为什么会TLE而不是WA
by CrazyProgrammer @ 2024-04-13 12:44:48


我在网站上回过你了。读入的问题。
by llltom @ 2024-04-13 13:39:29


|