JOIST/JOISC 板刷计划
11.3 23:00 开始写。
你说的对,但是我真的分不清这两个又啥区别 /kk。
P9331 [JOIST 2023] 护照 / Passport
把 \(i\) 连向 \(i+n\) 边权为 \(1\),\(i+n\) 连向 \([l_i,r_i]\) 边权为 \(0\)。
答案似乎是 \(dis(1,x)+dis(n,x)\),但可能会有重复的部分。这里有一个很妙的做法,先令所有数的答案为 \(dis(1,x)+dis(n,x)\),然后对于每一条边有松弛:\(ans_v \leq ans_u+w\),于是对 \(ans\) 再跑一遍最段路即可。
P9333 [JOIST 2023] 议会 / Council
首先对于一个人的贡献可以直接去掉,这个信息可减,也好维护。然后考虑了另一个人。
可以发现,对于一个决议,一个人的影响是有限的。设一个决议原本同意和不同意的人数为 \(x,y\),它只可能在它同意并且原本票数刚好超过 \(\frac{n}{2}\) 时有影响,于是我们可以对于每个主席 \(i\),求出它去掉以后哪些决议满足刚好超过 \(\frac{n}{2}\)(超 1 个),然后就是要求这个子集和原本除了 \(i\) 以外的其它子集的交的 min,直接 sos dp 即可,具体实现得进行神人分讨,见代码。
P9340 [JOIST 2023] 旅行 / Tourism
显然答案就是 \(dep_{lca(all)}-1+\sum_u [u 中有l到r的关键点]\)。考虑每个点来贡献询问。考虑 dsu on tree,对于子树内的关键点,先考虑一个暴力:依次插入:每次新增的有贡献的区间就是 \(l \in [prev,pos],r \in [pos,next]\),用 dsu on tree 优化这个过程,轻子树不变,正常加,重子树显然不能在上面处理,只能在重子树自己内部就把它会被计算的次数加上,那么显然就是记录一下链顶端即可。
P9520 [JOIST 2022] 监狱 / Jail
显然如果没有囚犯挡住其它人的路,那么直接走。如果有,我考虑一个囚犯的路径被一些其它的囚犯挡住了,那么就相当于说这些其它的囚犯要比这一个囚犯先走,那么把这种关系看成有向边,就是要判环。直接做是 n^2 的,加个树剖,在 dfn 层面变成一个点连向一个区间,线段树状物即可。
P10438 [JOIST 2024] 塔楼 / Tower
如果 \(D \times A \geq B\),那么尽量少跳 \(D\),用 dp 表示跳到每个位置的最小次数,显然我们考虑每一段非施工区间,必然是前面一个前缀到不了,后面的 dp 值相同。这部分怎么做都行。
如果 \(D \times A<B\),要尽量多跳 \(D\),还是考虑 dp,可以发发现每过 \(D\) 个位置,值必然 \(+1\),并且走 \(\leq D\) 格涨幅不超过 1,所以每一段形如前缀不断 \(+1\) 往后覆盖,直接二分。

浙公网安备 33010602011771号