社区讨论
关于树状数组O(n)初始化
学术版参与者 4已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lodaeaje
- 此快照首次捕获于
- 2023/10/31 03:22 2 年前
- 此快照最后确认于
- 2023/11/05 13:46 2 年前
看了《算法进阶指南》后按照作者的思路自己写了一份代码(可以保证正确性无误):
CPPvoid init(int x,int v) {
int p=x-lowbit(x),add=(x-p)/2;
while(add) p+=add,c[x]=max(c[p],c[x]),add/=2;
c[x]=max(c[x],v);
}
原理就是每个节点的信息从它的子节点获得。
在main函数里这样写:for(int i=1;i<=n;i++) init(i,read())
有大佬说可以用前缀和来O(n)初始化,但是可以注意到我代码中是取max,所以前缀和这种方案行不通。
但是发现这样写的效率还不是O(nlogn)初始化呢qwq
是我代码写得常数太大了吗?有大佬有好的写法么=w=
回复
共 5 条回复,欢迎继续交流。
正在加载回复...