Loading

NOIP 模拟赛十四

“原题杯” 。

异或和

\(\boldsymbol{BIT,拆位}\)
按位考虑,前缀和后考虑 \(s_r-s_{l-1}\) 什么情况下第 \(k\) 位是 \(1\)
发现取值只有 \(2\times 2=4\) 种情况,分情况判断是否需要借位。
借位可以通过低于 \(k\) 位的大小来判断。
然后就可以通过树状数组维护个数了。

Record

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\) ,删除就再加回来。

Record

[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)\)

Record

posted @ 2025-09-06 19:55  qkhm  阅读(6)  评论(0)    收藏  举报