@[QinYulang](/user/1201743)
你的 `size` 意义何在
by lunjiahao @ 2024-08-14 21:11:42
@[lunjiahao](/user/779970) 没意义
by QinYulang @ 2024-08-14 21:14:24
@[QinYulang](/user/1201743)
因为每次都进行区间开方操作,可以记录一下区间最大值,若是最大值已经是 $1$ 了就可以不用往下递归了
例:
```cpp
void update(int u,int l,int r,int x,int y)
{
if(y<l||r<x) return;
if(l==r)
{
t[u]=maxl[u]=sqrt(t[u]);
return;
}
int mid=(l+r)>>1;
if(x<=mid&&maxl[ls]>1) update(ls,l,mid,x,y);
if(y>mid&&maxl[rs]>1) update(rs,mid+1,r,x,y);
push_up(u);
}
```
by lunjiahao @ 2024-08-14 21:17:01
@[lunjiahao](/user/779970)
懂了谢谢谢谢
by QinYulang @ 2024-08-14 21:18:44
@[lunjiahao](/user/779970) 这就去改
by QinYulang @ 2024-08-14 21:19:14
@[lunjiahao](/user/779970) 样例测了,最后一个不对,应是6,我输出了5
by QinYulang @ 2024-08-14 21:23:25
@[lunjiahao](/user/779970) 为什么呢
by QinYulang @ 2024-08-14 21:27:48
@[QinYulang](/user/1201743)
奇怪了为啥你的程序会算少
by lunjiahao @ 2024-08-14 21:36:08
@[QinYulang](/user/1201743)
破案了
`modify` 函数中
```cpp
if(l <= mid) modify(k << 1, l, mid);
if(mid < r) modify(k << 1 | 1, mid + 1, r);
```
应该为
```cpp
if(l <= mid && tree[k << 1].max > 1) modify(k << 1, l, r);
if(mid < r && tree[k << 1 | 1].max > 1) modify(k << 1 | 1, l, r);
```
还有 `if(tree[k].val == tree[k].size) return ;` 删去,且记得开 `long long` !!!
~~完了眼睛真的不好看了几次都没看到~~
by lunjiahao @ 2024-08-14 21:54:41
@[lunjiahao](/user/779970) 过了过了谢谢
by QinYulang @ 2024-08-15 09:29:24