JOISC做题记录
题目真的很好!!!所以来写一写。
但都是一句话题解,因为我实在很懒。打 * 的是完全不会做的,打 # 的是基本做出来但没有独立写对/差了一口气。
慢慢补,不急
2021 Day1T3 Food Court
先预处理出每次查询事件前当前店离开了多少人,转化为只有加入和查询的情况。这是容易的,一个简单做法是直接整体二分+树状数组。$O(n \log^2 n)$。
好像容易优化到单 log。
2021 Day2T2 Road Construction
简单题。转切比雪夫,二分答案,然后判定是个二维数点。求答案继续二维数点,过程中加一个 set 查一查就行了。$O(n \log^2 n)$。
2021 Day3T1 Ancient Machine
先考虑如果 Bruno 得到所有字符,他应该怎么做。
容易发现好操作个数的一个上界:删去最左边的 X 之前的所有字符,再以所有 Z 为分隔符划段后,存在 Y 的段数。
得到这个上界也是容易的:先删去最左边的 X 之前的所有字符,然后对于每一段,任意删去(不算分隔符 Z),但一定留一个 Y 在最后删(如果存在),这是当然一定是好操作,然后再删掉分隔符。
但传过去所有字符显然不是很行。稍微修改一下策略:对于每一段,从最后一个字符(不算分隔符 Z)开始往前一路删。容易发现这一段的最前的 Y 被删去时,一定是一次好操作。
这样我们只需要记录第一个 X 和所有 Z 的位置。直接传过去能得 70 了。
注意到满分要求 $L<n$,大胆猜测我们记录的状态数可以压缩。我们发现对于连续的 Z,我们只保留最后一个的位置不会影响得到的答案。X的位置单独传过去,那么我们只需要传一个长度为 $n$,且没有连续 $1$ 的串了。对整段计算可以发现合法的方案数确实可以接受,但是直接对长度为 $n$ 的串标号时空复杂度都受不了。于是将串分为若干小段,对每一段算一下。经过计算我取的每段长为 $86$,需要占用 $60$ bit,最后一共使用了 $69797$ bit。
2021 Day3T3 Meetings 2
简单题。
最优点即为带权重心,$k$ 为奇数时答案为 $1$,$k$ 为偶数时答案为最长的一条链使得两端子树大小 $\ge \frac{k}{2}$。
直接无脑上点分,开个桶算一下就行了。$O(n \log n)$。
2021 Day4T1 Event Hopping 2
先离散化。看到字典序肯定是考虑贪心了,即从小到大判断选择当前这个后,之后的线段是否还能得到合法方案。
那这个容易想到 set 维护所有可以放的区间,倍增预处理 $f_{i,j}$ 表示从 $i$ 位置往后放 $2^j$ 条线段最小要占用到的最大位置,就可以查询一个区间能放多少线段了。
实现有一些小细节。$O(n \log n)$。
*2021 Day4T3 Worst Reporter 4
典题。但是好难写啊呜呜,为啥我这么不会写代码呢。
连边 $i \to a_i$,得到一个内向基环树森林。环上的所有点的值应当相等,树上每个点的值应当大于等于其父亲。树的部分有 $O(n^2)$ 的暴力 dp,即设 $f_{i,j}$ 表示考虑 $i$ 的子树,且 $i$ 这个点最终值为 $j$ 的情况下的最小代价。合并转移是一个 + 后缀 min 的形式,直接参考 NOI 2020 命运的套路,上线段树合并维护即可。
最后把环上点的线段树再合并,再枚举每个环上点的最终值(可能为某个环上点的初始值或 $1$),再在线段树上查对应贡献,取最小值即可。$O(n \log n)$。
2022 Day1T1 Jail
刚开始乱猜了很久猜不对,冷静一下发现最优方案每个人一定只会走一次,于是直接按先后顺序关系建图判断是否是 DAG 即可。用线段树优化建图,$O(n \log^2 n)$。
2022 Day1T2 Sightseeing in Kyoto
纯猜过去的。
$O(n^2)$ 平凡,看 subtask2,考虑怎么 $O(V^2)$。
猜测保留单调栈内元素即可。不对。
猜测保留下凸壳上元素即可。对了。
猜测每次选择沿斜率较小的方向走即可。过了。
证明也就是调整一下,推推式子啥的。
* 2022 Day1T3 Misspelling
这题不该做不出来的。
考虑 $T_i \le T_j(i<j)$ 等价于 $s_{i \sim j}$ 完全相等或 $s_i<s_p$,$p$ 为最小的大于 $i$ 且 $s_i \neq s_p$ 的位置。
于是从后向前 dp,设 $f_{i,j}$ 表示考虑后缀,当前 $s_i=j$ 的方案数。转移可以自行推导,其过程用链表维护。$O(n \lvert \sum \rvert)$。
2022 Day2T1 Copy and Paste 3
$O(n^3)$ 过 $2500$,自信即巅峰。
考虑区间 dp,设 $f_{l,r}$ 表示得到 $s[l,r]$ 的最小时间,转移时 A 操作 $O(1)$,BC 操作只需要枚举一个端点 $O(n)$,复杂度三方。
你发现它不是很跑的满,于是大力卡常剪枝,比如预处理转移串前两位的信息,可以砍掉不少常数,强行卡进去。
正经做法是上 SAM / 倍增 等操作优化这个东西,我赛时并没有想到。
2022 Day2T3 Team Contest
签到题,直接贪心,考虑最大值 $A,B,C$,不相同直接输出,否则发现出现超过一次的海狸不可能成为答案,直接删掉再重复这个过程即可。$O(n \log n)$。
2022 Day3T2 Sprinkler
签到题,考虑统计答案时,在所有合法点中最浅的位置统计,维护一个点向上跳 40 步的信息就好。
2022 Day4T1 Super Dango Maker
我直接每次 shuffle,然后二分找到最靠前的一组 $1 \sim n$,然后它过了啊,别问我为啥,我不知道啊。
# 2022 Day4T2 Fish 2
不难想但难写啊!
考虑一条鱼 $i$ 吃不出去,就意味着存在 $l \le i \le r$ 满足 $\min\{a_{l-1},a_{r+1}\} > \sum\limits_{i=l}^r a_i$。从所有点开始不停向外跳,用线段树二分找 $l,r$,容易发现一次 sum 至少翻倍,所以从一个点开始只会跳 $\log n$ 次。那预处理这个初始信息就是 $O(n \log n \log V)$ 的,全局查询再开一棵维护区间最小值个数的线段树就好。带修,区间查询都是类似的 dirty work,没什么意思。$O((n+Q) \log n \log V)$。
2023 Day1T1 Two Currencies
签到题。主席树上二分就行。$O((n+Q) \log n)$。
* 2023 Day1T2 Festivals in JOI Kingdom 2
这是人类能想到的吗???/流泪
正确的贪心策略显然是先按右端点排序,然后再能选则选。总方案数则是 $\prod_{i=1}^n 2i-1$,我们应该算合法方案,再减一下就行。
但我们依然找不到切入点。考虑探索性质。
假设正确的贪心选出的区间叫红区间,假贪心选出的区间叫蓝区间,同时选的区间叫紫区间,剩下没被选到的叫做黑区间。
- 相邻两个红区间的右端点之间不存在其他完整区间
- 相邻两个蓝区间之间不存在其他完整区间
- 黑区间的左端点必须在一个蓝区间内
考虑按顺序将红蓝区间一一匹配。继续观察,可以发现:
- 一对红蓝区间定然有交。
- 进一步推得,对于一个红色区间,它配对的蓝色区间的右端点一定大于等于自己的右端点,它前一个的蓝区间的右端点一定小于自己的右端点。
于是考虑设计 dp,按顺序插入每一对红蓝区间,并记录当前有多少个位置可以插入黑区间,即 $f_{i,j,0/1}$ 表示已经插入 $i$ 个区间,有 $j$ 个位置可以插入黑区间,当前插入的红蓝区间是不是一个紫区间的方案数。转移枚举 $k$ 表示插入黑区间个数,复杂度 $O(n^3)$,过不掉。
怎么办呢?感觉上 $i,k$ 打不动,考虑优化掉看上去更有优化空间的 $j$。我们改为倒序加入区间,由于右端点没有限制,我们 $j$ 这一维就可以舍去了!于是就可以做到 $O(n^2)$。转移不是重点,我摸了,skip it。
可以用多项式优化到 $O(n \log^2 n)$,但是使用 modint 足以在 $n=20000$ 时轻松跑进时限。
2023 Day1T3 Passport
走遍 $1 \sim n$ 显然等价于走到 $1$ 和 $n$。
考虑 $x$ 点的答案长什么样,枚举一个中转点 $y$,求最小的 $dis_{1,y}+dis_{x,y}+dis_{y,n}$。
但直接这么做的话,时间复杂度实在难以接受。但我们发现从 $x$ 到最优的 $y$ 的路径上贡献一定也是一直减少的,我们先钦定 $ans_x=dis_{1,x}+dis_{x,n}$,然后对于存在的边 $(u,v,w)$,讨论一下两点贡献有 $ans_v \le ans_u+w$,再求一遍最短路就好。
再上个线段树优化建图就行了。$O(n \log n)$。
2023 Day2T1 Belt Conveyor
乱搞,启动。
把点按 $dep \bmod 3$ 分类,然后每次拉一个类出来问:
- 如果一个点移动了,那么那条边的状态就能确定。
- 否则那一个点的所有出边的状态就能确定。
不会分析,但直接能过 QOJ 的数据。
交到原题上被卡了一个点,但是 IOI 赛制,瞎改两下顺序就过了()。
2023 Day2T2 Council
简单高维前缀和练习题,两遍高维前缀和分别求一下一个子集的存在性(0/1/2)和一个子集的最大/次大存在子集 popcount 就做完了。$O(nm+m2^m)$。
2023 Day3T3 Tourism
求区间虚树路径覆盖,经典 trick 是其等于 dfn 排序后相邻点距离和(包括首尾)最后除以二,直接莫队+set,$O(n \sqrt n \log n)$,被卡了过不去,改成只删不加的回滚莫队,$O(n \sqrt n)$。
# 2023 Day4T1 The Last Battle
一个简单的想法是用一些格子表示 $x,y$ 的信息,剩下的格子传递答案。显然对角线是一个好的选择。
然后你发现构造一个一定不冲突表示 $x,y$ 的好难啊,怎么办呢??
结果标算是模拟退火。。。
退火 64/72($x=y$ 分成两种)种格子,可以做到 $n=42/43$。取决于你的耐心和退火代码的质量。
2023 Day4T3 Bitaro's travel
普及组题,只会显然转向 $\log V$ 次,直接每次二分找,$O(n \log n \log V)$。