社区讨论
求助关于时间复杂度的验证
学术版参与者 4已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @lo8wnlls
- 此快照首次捕获于
- 2023/10/28 01:46 2 年前
- 此快照最后确认于
- 2023/10/28 01:46 2 年前
RT,在“维护区间绝对值之和”这个问题中(操作有区间加、区间查询两种),我的思路是开两个线段树,一个维护正数的和以及最大值,一个维护负数的和以及最大值。每次在区间加的时候,每个负数最多只会变成正数一次,所以理论上均摊是 的,但是我自己造了一个 1e6 的数据却 T 飞了。
CPPscanf("%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 条回复,欢迎继续交流。
正在加载回复...