NOIP 模拟赛十四
“原题杯” 。
异或和
\(\boldsymbol{BIT,拆位}\) 。
按位考虑,前缀和后考虑 \(s_r-s_{l-1}\) 什么情况下第 \(k\) 位是 \(1\) 。
发现取值只有 \(2\times 2=4\) 种情况,分情况判断是否需要借位。
借位可以通过低于 \(k\) 位的大小来判断。
然后就可以通过树状数组维护个数了。
joisc2019_d
\(\boldsymbol{扫描线,吉司机}\) 。
正着反着做两次,就可以直接找合法对 \(a_i-a_j\) 的 \(\max\) 了。
以正着做为例。
对于每个点 \(x\),将其在 \(x+l_x\) 打上激活标记,然后在 \(x+r_x+1\) 打上删除标记。
每个点维护与目前加入的右端点配对的最优值。
每加入一个右端点 \(x\) ,就更新 \([x-r_x, x-l_x]\) 内激活的点的答案。
区间 \(\max ans\) 就可以用 \(a_x-\min a\) 更新,再维护一个历史最大 \(a_x\) 用来下传。
查询直接区间询问最大值即可。
对于激活,可以将初值设为 \(a_x+\infty\) ,激活就减去 \(\infty\) ,删除就再加回来。
[APIO2019] 桥梁
\(\boldsymbol{根号重构}\) 。
Link
Magic Tree
\(\boldsymbol{线段树合并,dp}\) 。
记 \(f[u, k]\) 为 \(u\) 子树内 \(k\) 时刻之前能够获得的最大价值。
当不选取 \(u\) 的贡献时, \(f[u, k]=\sum_v f[v, k]\) 。
如果选取,那么会对 \(d_u\) 之后的时刻造成影响。 \(f[u, k] = w_u + \sum_v f[v, d_u]\) 。
两种情况取更优,发现这个过程可以通过线段树合并来维护。
具体的,对于后面的区间取 \(\max\) ,因为整个 \(f\) 数组一定单调不降,所以可以直接区间赋值。
为了便于合并,我们将符合条件的区间子树直接整个删去,然后打上区间加的 tag
,并使用标记永久化,这样便可以合并了。
复杂度 \(O(n\log n)\) 。
时间仓促,如有错误欢迎指出,欢迎在评论区讨论,如对您有帮助还请点个推荐、关注支持一下