JOISC2025 做题记录

Day1T1 Exhibition 3

非常好的题目,整体的思路非常厉害!以前听过所以 vp 就 all in T2 了。

由于要求字典序,于是按照值域填入 \(b\) 序列,每次选择一个最前的集合 \(S\),满足 \(S\) 可以用 \(C_v\) 个位置覆盖,然后将 \(B_S \to v\)。考虑分析 \(S\) 的结构,发现其可以形成一个前缀 \([1,pr]\) 加散点 \(T\),且前缀 \([1,pr]\) 所需覆盖位置已经到达 \(C_v\)!于是有一个思路:分 \(pr\)\(T\) 分别求解。

首先对于 \([1,pr]\) 的部分,发现可以在 \(O(pr \times poly(\log(n)))\) 的复杂度找到即可。一个想法是直接二分,但是 \(pr\) 小的时候就爆了。所以先用倍增!!!确定 \(pr \in [2^k,2^{k+1}]\)然后再在这个区间进行二分即可,那么需要 check 的区间长度就是 \(O(pr)\) 直接暴力 check 即可。

对于 \(T\) 的求解,由于 \([1,pr]\) 所覆盖的位置到达 \(C_v\),即只需考虑类似于 “判定” 的事情。于是考虑原本 \(S\) 中的一组解 \(p_1,p_2,\cdots,p_k\),那么加入一个区间 \([l,r]\) 会使 \(k \gets k+1\),则考虑新的解与这个解的区别 xor,则一定替换 \(p\) 一个区间,假定将 \(p_{i,j} \to q_{1,l}\),则大概形如 \(q_1,q_l\) 只与 \(p_i,p_j\) 相交,而 \(p_{id\in[2,l-1]}\) 则与 \(p_{id,id+1}\) 相交。所以快速判断区间 \([l,r]\) 是否合法,就类似于 check 从 \([l,r]\) 出发能否向左/右扩展找到类似于上述结构,且不难发现对于 \(p_{1,k}\) 的每个区间,能向左扩展的为后缀,向右扩展的为前缀,那么不难想到维护 “安全” 区间 \([lp_i,rp_i]\) 即区间内的数均不能扩展,则对于 \([l,r]\) 合法则只要与 “安全” 区间有交即可。但是需要 \(O(n)\) 次这样的判定,且在加入区间的过程中“安全”区间可能发现变化。于是发现若 \([l,r]\) 只与一个安全区间 \([lp_x,rp_x]\) 相交,那么对于 \(>r\) 的点可以向左扩展到 \([l,r]\)\(<l\) 同理,即 \([lp_x,rp_x]\) 会与 \([l,r]\) 求交,那么这样操作完后,就会导致一系列曾经加入的区间变为只有 \(1\) 个 “安全” 区间相交,并要求交。事实上,注意到若一个区间 \([l,r]\) 已经包含了安全区间 \([lp_x,rp_x]\) 则显然不会对任何区间产生影响,所以上述的 “连锁” 反应的总区间个数为 \(O(n_1)\),精细实现即可。所以现在就得到了一个单次 \(O(n)\) 求解所有 \(T\)

优化到单次 \(O(n_1 \times poly(\log))\) 是容易的,相当于找到第一个与某个 \([lp_x,rp_x]\) 有交的区间,可以在 \(x\) 修改的时候动态维护信息即可,这样总复杂度做到 \(O(n\log^2n)\),精细实现可以做到 \(O(n\log n)\)

Day1T2 Fortune Telling 3

非常精妙的题!vp的时候获得了 71pts,与正解只是结构类似,但是组合数的角度没有 get 到。

考虑如何做到 \(O(n\log n)\) 步,自然的想法是二进制表示 \(k\)发现信息在过程中非常复杂,于是考虑前面 \(N-p\) 次操作普遍处理,最后 \(p\) 次操作特殊处理。于是假定前 \(N-p\) 次操作 \(1\) 的个数为 \(c\),所以先将 \(\log(c)\)\(1\) 取出来,然后在后 \(p\) 操作过程中,相当于消除一些位置,一个自然的想法就是在 \(1\) 前面加 \(0\)!但是如果遇到 \(1\) 就没有任何作用,但是相对应如果取出 \(\log(c)\)\(0\) 并在其前面加入 \(1\) 同样可以表示!所以就可以考虑取出 \(10\)\(0101\cdots01\) 则只需要取 \(p=10\) 即可将后面的信息表示,对于多出来的位可以放到最后即可。那么 Bob 的操作就是找到 \(0101\cdots01\) 的最前的子序列即可。这样可以做到 \(30\) 次,有 49pts。

考虑优化,首先一个优化就是每次可以至多更改 \(5\) 个位置(即 \(0 \to 1\)\(1 \to 0\));而表示是哪种变化可以多用 \(1\) 位。所以这样做到 \(26\) 次。然后就是一个经典的思路就是进制优化,发现当使用 \(4\) 进制的时候可以直接做到 \(18\) 次拿到 71pts。感觉是 “进制” 理解方式的最优解,至少我没有找到比这个优秀的。

那么现在需要跳出进制的过程,发现其本质就是在第 \(i\) 位放上若干个数,且这个数的个数可以不被限制!于是假定有 \(C_1\) 位(也可以理解为分隔符),最后放入有 \(C_2\) 个位置,则有 \(\binom{C_1+C_2}{C_1}\) 种数可以放入,这样取一下 \(C_1=5,C_2=8\) 做到 \(18\) 次。

考虑继续优化。发现上面查询的长度都是 \(18\),所以没有充分利用 \(<18\) 串的信息。那么利用上 \(i \le C_2\) 之后做到 \(\sum_{i\le C_1} \binom{i+C_2}{i}\) 次。但是如果选择 \(C_2\)\(i\) 元素加入剩下的 \(C_2-i\) 个元素表示不了,所以需要选择最后 \(i\) 个元素,且表示的数 \(k\) 应该是前 \(N-i\)\(1\) 的个数。所以这里需要动态 \(i\)\(k\) 的关系。这里取 \(C_1=4,C_2=8\) 做到 \(16\) 次!然后继续从 \(C_1\) 的角度,考虑 \(C_1\) 部分,这里与 \(C_1\) 的部分类似,即做到 \(\sum_{i \le C_1}\sum_{j \le 14-i-C_1} \binom{i+j}i\)。于是取 \(C_1=4\) 即可。

总结:

  • 对于后 \(n-p\) 调整的考虑;
  • 在前 \(p\) 个中以 \(0,1\) 进行分隔符,并理解为组合数的形式;
  • 对长度的利用,做到 \(14\) 次。

D2T1 Ambulance

vp 过了,因为前后缀优化卡了 30min。。。

一个直觉就是观察解的结构。可以考虑调整法观察,对于相邻的调整比较复杂,但是对角线的调整不难发现分别是 \(X_i+Y_i\)\(X_i-Y-i\) 的前后缀。于是可以直接枚举分界点就分成了 \(4\) 个区域,每个区域只有 \(2\) 个医院可达,可以直接做 \(O(nk)\) 的背包,然后枚举即可。复杂度 \(O(n^3k)\),不难发现可以前后缀和优化,做到 \(O(n^2k)\)

D2T3 Space Thief

vp 时会了 40pts,但是只打了 15pts(确实比较难打)。

先考虑树的部分。树可以进行边分治,找到一个边集 \(S\),满足 \(S\) 可达。一个比较巧妙的想法就是,将 \(S\) 所构成的 dag 拍成 topu 序理解,惊奇的发现就和链的结构完全一致,即可以利用分治结构找到 \(s,t\) 第一次被分治区间的层数,然后二分找到具体分治区间,然后再对 \(s,t\) 分别二分找到其具体位置。所以树的部分就完成了。

而对于图的部分本质类似。发现若已知的可达集合 \(S\)\(S\) 构成是 dag,同样可以拍成 topu 序完成。所以现在只需要找到可达集合 \(S\)\(S\) 构成的是 dag,即取原图 \(G\) 的一棵生成树 \(T\) 进行边分治与树的部分相同,而对于 \(G\) 剩下的边只需符合 \(T\) 查询时的 topu 序即可。于是做到 \(O(n\log n)\),非常充裕。

D3T1 Bitaro the Brave 3

这场被 T1 爆了,还是太菜了。

首先是正解。大概就是 \(01\) 化拆分成 \([p_i \ge x]\) 的形式之和,然后每个部分用 Halls 定理得到是一个凸包的变化,于是做到 \(O(n^2+L+Q)\)。当然这个 \(01\) 的转换还有费用流增广的理解方式。

然后是 drc 老师的做法,就是先猜测答案的差分形成的段数只有 \(O(n)\) 段。不难发现差分相同的段每个点的差分变化量是相同的,于是可以对每个后缀求解以这个差分一直进行的最大扩展,然后复杂度也是 \(O(n^2+L+Q)\)。但是疯狂证明依旧证不出来 \(O(n)\) /kel/kel/kel

posted @ 2026-08-01 17:29  wangzhongyuan  阅读(11)  评论(0)    收藏  举报