JOISC 2023 做题记录

Day1

A

很显然的贪心:选择方案一定是先选取链上从小到大排序后的一段前缀,使银币刚好够用,再判断金币够不够用。

先考虑在序列上怎么做:主席树上二分。考虑怎么把序列上的做法搬到树上,这个没想到啊,很不应该!具体做法为:对每个点建立一颗从根到这个点的线段树,处理询问 \((x,y)\) 时,将 \(tree(x)\)\(tree(y)\) 加起来减去 \(tree(lca(x,y))\) 即可。

提交记录

B

太难了,以后再补。

C

考虑建图:将 \([L_i,R_i]\) 连向 \(i\)。显然这个是可以用线段树优化至 \(O(n\log n)\) 的。

容易发现,遍历整个序列等价于可以到达 \(1\)\(n\)。因此考虑最短路,求出 \(dis_{1,x}\)\(dis_{n,x}\),对于点 \(x\),答案上界即为 \(dis_{1,x}+dis_{n,x}\)

考虑最终答案长什么样:一定是先走一段相交的部分,然后再各自分开,走向 \(1/n\) 。记 \(d_x=dis_{1,x}+dis_{n,x}\),显然,对于有向边 \((x,y,w)\),若 \(d_y>d_x+w\),则更新 \(d_y\)\(d_x+w\) 。容易发现上述部分仍然是一个三角不等式,跑最短路松弛即可。

因为线段树上的边权都是 \(0\),虚点连向实点的边权是 \(1\),所以跑 0-1 BFS 即可。

提交记录

Day2

A

交互题,以后再补。

B

重新学了一遍高维前缀和/sos-dp,深刻理解了!以下内容是在知道本题要 sos-dp 后独立思考得出的。

注意到,钦定一个人为主席后,对于此时得票数大于 \(\lfloor \frac{n}{2} \rfloor\) 的议案,不管怎么选副主席,均能通过;对于此时得票数小于 \(\lfloor \frac{n}{2} \rfloor\) 的议案,不管怎么选副主席,均不能通过。所以需要考虑的只有此时得票数恰好等于 \(\lfloor \frac{n}{2} \rfloor\) 的议案。

\(S_i\) 为:钦定 \(i\) 为主席后,得票数等于 \(\lfloor \frac{n}{2} \rfloor\) 的议案集合。记 \(T_i\)\(i\) 的投票状态取反后的状态。记 \(base_i\) 为:钦定 \(i\) 为主席后,此时得票数大于 \(\lfloor \frac{n}{2} \rfloor\) 的议案的个数。那么对于 \(i\) 的答案,形式化表述即为:

\(base_i+\max_{T_j \bigcap S_i} \mid T_j \bigcap S_i \mid\)

这是一个我们熟知的高维前缀 \(\max\) 的形式。但是我们还要对 \(T_j\) 这个条件进行限制,所以不能直接做高维前缀 \(\max\)。接下来考虑如何处理这个限制:注意到,\(T_j\)\(T_j \bigcap S_i\) 的超集,而 \(T_j \bigcap S_i\) 又是 \(S_i\) 的子集。那么,我们可以先以 \(T_j\) 为基础做一遍高维后缀 \(\max\)(即超集 \(\max\)),再做一遍高维前缀 \(\max\) 即可。这样就能保证枚举到的集合同时满足是 \(S_i\)\(T_j\) 的子集这两个条件,因此是合法的。

因为本题还要求主席与副主席的编号不同,所以在转移的时候,不仅要维护最大值和最大值编号,还要维护次大值及其编号。写起来有点令人暴躁。

题交记录

posted @ 2024-03-23 19:57  Luminescence_2024  阅读(30)  评论(0)    收藏  举报