70分,三个点RE求助

P1531 I Hate It

我将你的数字又开大了 1 倍,60 变 90 且一个点 tle,线段树的左边界和右边界还是在递归里在线修改好,装成 struct 会慢很多 @[太阳之神2015](/space/show?uid=6851)
by Sooke @ 2017-10-26 21:56:56


@[Sooke](/space/show?uid=26673) 可是这个题解的代码过了 ```cpp #include<iostream> #include<algorithm> using namespace std; const int MAXN=800000+2; struct edge{ int l,r,mx; }tree[MAXN]; int a[MAXN]; int n,m; void buildtree(int x,int l,int r){ tree[x].l=l; tree[x].r=r; if(l==r){ tree[x].mx=a[l]; return; } buildtree(x*2,l,(l+r)>>1); buildtree(x*2+1,1+((l+r)>>1),r); tree[x].mx=max(tree[x*2].mx,tree[x*2+1].mx); } void update(int x,int l,int r,int k){ if(tree[x].l>=l && tree[x].r<=r){ tree[x].mx=max(tree[x].mx,k); return; } if(tree[x].l>r || tree[x].r<l) return; update(x*2,l,r,k); update(x*2+1,l,r,k); tree[x].mx=max(tree[x*2].mx,tree[x*2+1].mx); } int query(int x,int l,int r){ if(tree[x].l>=l && tree[x].r<=r) return tree[x].mx; if(tree[x].l>r || tree[x].r<l) return 0; int ans=0; ans=max(query(2*x,l,r),query(2*x+1,l,r)); return ans; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; buildtree(1,1,n); for(int i=1;i<=m;i++){ char pd; int x,y; cin>>pd; if(pd=='Q'){ cin>>x>>y; cout<<query(1,x,y)<<endl; } else{ cin>>x>>y; update(1,x,x,y); } } return 0; } ```
by 太阳之神2015 @ 2017-10-27 21:01:34


@[太阳之神2015](/space/show?uid=6851) 区别在于位运算 × 2 可以写 << 1 × 2 + 1 可以写 << 1 | 1 可能是位运算挽回了很大的常数吧
by Sooke @ 2017-10-27 21:34:50


|