JOISC 2023 记录

目前 6/7/12 (code/sol/problem)

D1T1 Two Currencies

给定一棵大小为 \(n\) 的树 \(T\),树上有 \(m\) 条关键边,经过关键边要么缴纳一枚金币要么缴纳 \(c\) 枚银币。

\(Q\) 组询问,每次询问从 \(a\) 走到 \(b\)\(x\) 枚金币 \(y\) 枚银币能否到达,如果可以到达还需最大化剩下的金币数。

\(n,m,Q\le 10^5\)

使用可持久化线段树记录下每个点向上到根的边权,那么 \(a\to b\) 可以用三棵线段树做差得到。

我们希望金币最多,那么希望银币带走尽可能多的关键边,于是二分查一下能够处理掉多少关键边就行了。

时间复杂度线性对数。

D1T2 Festivals in JOI Kingdom 2

\(n\) 个区间组成的区间组 \([a_i,b_i]\) 是好的,当且仅当:

  • \(1\sim 2n\)\(a,b\) 中各只出现一次。

  • \(a_i<b_i\)\(a_i<a_{i+1}\)

  • 下列算法计算「选出尽可能多的区间它们两两之间无交」的答案错误:

    • 按顺序扫描区间,如果当前区间与之前选择的区间均无交,则将其加入答案。

对好的区间组计数,\(n\le 2\times 10^4\)

不会。

如果暴力枚举括号序列,然后再枚举每一个左括号的归属的话,可以拿 \(10\) 分。

D1T3 Passport

\(n\) 个点,初始时只能访问某一个点,在 \(i\) 可以花费一的代价使得你可以访问 \([L_i,R_i]\) 这些点,满足 \(L_i\le i\le R_i\)

\(q\) 次询问,每次询问从某一个点出发,最少需要花费多少代价可以访问所有点。

\(n\le 2\times 10^5\)

对每个点建虚点表示买不买票,那么可以得到一种做法是原本的点连向虚点,这个边有代价,然后虚点再向对应区间的原点连边。

「向区间连边」,可以想到线段树优化建图,访问所有点,其实只要访问 \(1\)\(n\) 就行了。

建反图从 \(1\)\(n\) 分别跑最短路,那么可以得到初始答案 \(d_{1,u}+d_{u,n}\),注意到两边方案可能有重边,对重边的处理类似三角不等式 \(d_{u}+w<d_v\),再跑一遍最短路就行了。

时间复杂度线性对数平方,实现的不好可能会被卡常。

D2T1 Belt Conveyor

交互题,给定一棵 \(n\) 个点的树,边有方向,但是不知道方向。

每一次询问,你可以指定一个边集和一个点集,翻转边集的所有边之后,将你指定的点集中的点上各放置一个棋子,将棋子向任意一条所在点的出边移动一步,返回有棋子的点,并将树还原。

\(30\) 步内确定边的方向,\(n=10^5\),交互库自适应。

所有的一度点可以同时确定,所有的二度点可以同时三步确定。

那么同时确定所有一度点和二度点之后,可以将他们删除,然后确定新的一度点和二度点。

很难卡,估计卡不到 \(30\) 步。

另一种做法是,按 \(dep\bmod 3\) 分组,每次选最大的一组来确定一条边,当一个点的所有边都被确定就把它删掉。

这样做是 \(\log _{1.5} n=29\) 次,是标算。

写点实现细节:上述做法会出现两个点的祖先被走到,但是一个点其实是走到儿子的情况,实现中,可以先写点的边均为出边,然后写走到儿子,最后讨论祖先,这样就可以规避了,样例很强。

D2T2 Council

给定一个 \(n\)\(m\) 列的 \(01\) 矩阵 \(a\),先删去其中的第 \(x\) 行,然后你再选择删除一行,最大化剩下的 \(n-2\)\(m\) 列矩阵中 \(\sum_{j=1}^m [\sum_{i=1}^{n-2}a_{i,j}\ge \lfloor\frac n2\rfloor\ ]\)

\(x\in[1,n]\) 求解,\(n\le 3\times 10^5\)\(m\le 20\)

对于每一个 \(a_i\),考虑求出一个 \(b_i\),满足删除 \(i\) 之后个数恰好为 \(\lfloor\frac n2\rfloor\) 的列的集合。

如果删掉的另一行是 \(1\),那么这个就不会被通过,所以也就是对于每个 \(i\) 找出一个 \(j\) 满足 \(\text{popcount}(b_i\And a_j)\) 尽可能小,\(a_j\) 取反之后就是取最大值,满足 \(i\not= j\)

首先求出 \(f_S\) 表示对于某一个 \(S\) 是否存在 \(S\subset a_j\),这个可以高维后缀和,然后求出 \(g_{i,S}\) 表示是否存在 \(S\) 的子集满足 popcount 为 \(i\),这个可以高维前缀和。

注意到满足 \(i\not= j\),记一下每一个 \(1\) 来自哪里就行了,记两个本质不同的。

D2T3 Mizuyokan 2

给定一个长为 \(n\) 的序列 \(d\),支持如下操作:

  • 单点修改。

  • 区间查询,对于区间 \([l,r]\),最少需要如下操作几步,可以得到一个 zigzag 序列:

    • 操作:选择 \(i\),删除 \(d_i,d_{i+1}\),在 \(i\) 这个位置插入 \(d_i+d_{i+1}\)

    • zigzag 序列:升降相间的序列。

  • 上述操作的出现情况一定是先修改一次再查询一次,如此反复。

\(n\le 2.5\times 10^5\)\(5\times 10^4\) 次修改查询。

D3T1 Chorus

给定一个长为 \(2n\)\(01\) 串,有 \(n\)\(0\)\(n\)\(1\),你需要将他们划分成 \(k\) 个子序列,且 \(k\) 个子序列均可以划分成长度相等,先是均为 \(0\) 再是均为 \(1\) 的两个子段。

当然有的时候这不可行,你可以交换相邻的字符,在最小步数内使得存在一种划分方案。

\(n\le 10^6\)

D3T2 Cookies

\(n\) 种物品,每种物品有 \(a_i\) 个,你要把他们都装进盒子里,满足:

  • 盒子里的物品各不相同。

  • 盒子里的物品个数必须属于一个集合 \(b\)

求一组方案,如果存在多种,求出盒子最少的一种方案。

\(|b|\le n\le 1.5\times 10^4\)\(\sum a_i\le 1.5\times 10^4\)

结论:一组盒子,记他们的大小为 \(c\),将 \(c\) 从大到小排序后,合法当且仅当 \(\forall k,\sum_{i=1}^k c_i\le \sum_{i=1}^n \min(a_i,k)\)

基于这个,我们可以 DP,记 \(f_{i,j,k}\) 表示选了 \(i\) 个盒子,下一个盒子必须 \(\le j\),前缀和大小为 \(k\),是否可行,转移 \(O(1)\),但是暴力 DP 过不去。

注意到 \(i\times j\le \sum a_i\),那么状态数其实是 \(O(n^2\log n)\) 的,再加上 \(k\) 的转移可以压到 bitset里面,那么就可以做到 \(O(\frac{n^2\log n}{\omega})\) 了,在 DP 基础上记录方案是简单的,构造一个放物品的方案只需要用堆维护一下,哪个多丢那个就行了。

D3T3 Tourism

区间询问虚树所占连通块的大小。

\(n\le 10^5\)

一个普通的想法是莫队,每次暴力用 set 查 dfn 的前驱后继,然后统计答案,这个是 \(O(n\sqrt{n} \log n)\) 的,不能过。

如果改成回滚莫队即只删不加,用链表维护 dfn 的前驱后继,就可以做到 \(O(n\sqrt{n})\),应该能过。

考虑猫树分治,对于关键点来处理,对于每一层,对 \([l,r]\) 建虚树,我们希望求出跨越 \(mid\) 的答案:

  • 将点划分成两类 \([l,mid]\)\([mid+1,r]\),下文将这两类点叫做一类二类。

  • 考虑一条虚树上的边,它将虚树分为了两个连通块 \(S_1,S_2\),他的边权为 \(w\),那么,\(w\) 会被算入贡献的询问有:

    • 注意到 \(mid\)\(mid+1\) 一定得在 \(w\) 的一边,否则这条边一定会被计入答案。

    • 设在的那一边为 \(S_1\),另一边是 \(S_2\),那么记 \(S_2\) 中最大的一类点是 \(u\),最小的二类点是 \(v\),那么类似 \(l'\le u\lor r'\ge v\) 会被加上 \(w\),可以拆成 \(l'\le u\)\(r'\ge v\)\(l'\le u\land r'\ge v\) 容斥。

  • 上述三种询问均可以使用 \(l'\in[L_1,R_1],r'\in[L_2,R_2]\) 的形式描述,是二维数点,扫描线树状数组即可。

每次分治的时间复杂度是 \(O(L\log L)\) 的,所以总时间复杂度是 \(O(n\log n)\) 的。

D4T1 The Last Battle

通信题,小 A 和小 B 利用一个 \(8\times 8\) 的格子通信,小 A 可以向格子里除了第 \(x\) 行和第 \(y\) 列的数填上 \(01\),第 \(x\) 行和第 \(y\) 列将由交互库填上,小 A 需要传递给小 B 一个长度为 \(n\)\(01\) 串,小 B 只知道 \(n\) 和这个 \(8\times 8\) 的格子。

正确传输 \(n=43\) 的串。

D4T2 Security Guard

不写了,鸽。

D4T3 Bitaro's travel

以前这里有题意的,但是被不小心删了,所以鸽了。

绝对值的 beat,有意思,注意到反方向的一方距离一定会翻倍,所以转向走不超过 \(\log V\) 次。

假设现在访问了 \([l,r]\),在 \(u\),那么转移也就是比较 \(u-x_{l-1}\)\(x_{r+1}-u\),我们希望求出一直走的终止点,以向左为例就是找到 \(i\) 满足 \(x_i-x_{i-1}<x_{r+1}-x_i\),是一个偏序问题,在线回答偏序问题选择主席树,从而在 \(O(n\log V\log n)\) 的时间复杂度内解决。

posted @ 2023-03-24 15:50  cnyz  阅读(427)  评论(0编辑  收藏  举报