Educational Codeforces Round 131
https://codeforces.com/contest/1701
F. Points
如果 i < j < k 且 k-i <= d 则 称作美丽
初始没有点, q次操作, 每次操作3种可能
- 增加一个点
- 删除一个点
保证 集合中不会有相同点
每次操作后 计算 美丽的三元组个数
范围
q 2e5
d 2e5
a[i] 点坐标 [1,2e5]
6.5 s
512 mb
我的思路
简单讲, 就是 选两个距离小于d的点作为首尾, 然后问它们之间其它点的个数 作为贡献, 的贡献和
维护
其实增加一个点, 和删除一个点, 并不会影响其它点的组合,
影响的 三元组一定和操作的这个点有关
如果它是 最小的
= sum_{l=2~d} count(i,i+l) * c[l]
如果暴力算, 需要 O(d)
如果它在中间
= sum_{l=1~d-1} count(i,i-l) * c[i+d-l]
也是O(d)
感觉 似乎可能按照sqrt(max{a}) 分块
分块 对于不在中间的情况还好, 因为 相当于计算 (i,i+d] 之间 的不同值的点对个数, 在一个块里 预计算了, 在不同块里, 通过前缀和 可以算掉,
问题是 当加入的/删除的 为中间点时, 那么要找的就是 i < point < k, 且 k-i <= d
不知道有啥办法搞
题解
没那么麻烦 甚至还要简单
和上面我想的一样, 注意到关键的 不会点重复, 所以如果我们选定左侧点, 那么j和k的选择 就是binom( [i+1..i+d] 中点的个数,2)
ans = sum_i有点 binom(count[i+1,i+d],2)
考虑增加点x, 那么就是 x-d ~ x-1 对应的count 都+1了
而binom(v+1,2) - binom(v,2) = v, 相当于增加count的和
还要增加 对于 点x 的统计
删除是对称的
v -> v-1 , binom(v-1,2) - binom(v,2) = v-1, 相当与减少 (减少以后v-1)的和
还要减少对于 点x 的统计
代码
https://codeforces.com/contest/1701/problem/F
1 |
|
总结
评分2500
F
唉, 这感觉一上来就往复杂的想, 其实还挺基础了, 不应该不会