社区讨论

求助关于时间复杂度的验证

学术版参与者 4已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@lo8wnlls
此快照首次捕获于
2023/10/28 01:46
2 年前
此快照最后确认于
2023/10/28 01:46
2 年前
查看原帖
RT,在“维护区间绝对值之和”这个问题中(操作有区间加、区间查询两种),我的思路是开两个线段树,一个维护正数的和以及最大值,一个维护负数的和以及最大值。每次在区间加的时候,每个负数最多只会变成正数一次,所以理论上均摊是 O(nlogn)O(n \log n) 的,但是我自己造了一个 1e6 的数据却 T 飞了。
CPP
scanf("%lld",&k);
upd1(1,1,n,l,r,k); //给正数有效的东西都 +k
while(query1(1,1,n,l,r).first+k>=0)
{
	pair<int,int> tmp=query1(1,1,n,l,r); // 记录下来当前的信息(first 表示最大值,second 表示最大值的位置)
	upd1(1,1,n,tmp.second,tmp.second,INF+tmp.first+k); // 在正数中加上这个点
	upd2(1,1,n,tmp.second,tmp.second,INF); // 从负数中删去这个点
}
upd2(1,1,n,l,r,k);  // 给负数有效的点都 +k
以上是我的代码。我认为我的代码保证了一个负数最多只会计算一次,但是它 T 飞了,求大佬帮忙看一下是不是写出了问题。

回复

10 条回复,欢迎继续交流。

正在加载回复...