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
浙公网安备 33010602011771号