JOISC 2019 简要题解
「JOISC 2019 Day1」考试
- 略
「JOISC 2019 Day1」聚会
-
题意:交换,你可以问 3 个点,知道到 3 个点距离和最小的点,你要问出树的形态
保证 \(deg_u\le 18,n\le 2000\),可以问 40000 次 -
sol:考虑链怎么做(链顶为 \(x\)),随一个 \(u\),通过循环可以把点分到两边,然后递归求,次数为 \(n\log n\)
在树上的情况,我们随一个点 \(x\),求出 \(x\to 1\) 链上的所有点即顺序,然后分成若干个子树递归做
由于保证了度数,所以可以在 40000 次内完成
「JOISC 2019 Day1」馕
- sol:每次选需要最短的人切,容易归纳证明一定合法
「JOISC 2019 Day2」两个天线
-
给定 \(a_i,b_i,c_i\),若 \((i,j)\) 满足 \(a_i\le d(i,j)\le b_i,a_j\le d(i,j)\le b_j\),则可以贡献 \(|c_i-c_j|\)
每次问区间 \([l,r]\) 中,最大的贡献 \((i,j)\) 是多少 -
sol:绝对值可以拆开不考虑
考虑从左到右扫描线,在到 \(j\) 时,将 \(j=i+a_i\) 的 \(i\) 标记为合法,到 \(i+b_i+1\) 时标记为非法
然后将 \([j-b_i,j-a_i]\) 的答案,执行 \(ans_i:=max(ans_i,c_j-c_i)\),注意到这里只需将合法设为 \(-c_i\),非法设为 \(\infty\)
那么就是要求出历史最大值,用线段树可以维护
「JOISC 2019 Day2」两道料理
- sol:考虑朴素的 DP,即 \(f_{i,j}=f_{i-1,j}+p_i[a_i+b_j\le S_i],f_{i,j}=f_{i,j-1}+q_j[a_i+b_j\le T_j]\)
考虑按 \(i\) 转移,\(f[i-1]\to f[i]\),第一种操作相当于是对一个前缀加上 \(p_i\),第二种操作为 \(f_j:=max(f_j,f_{j-1}+q_j)\)
其中每个 \(q_j\) 最多变化一次,我们维护差分数组 \(d\),那么就是 \(d_i:=max(d_i,q_i)\)
那么操作变成了:\(if(q_i>d_i) d_{i+1}-=q_i-d_i,d_i=q_i\)
维护 \(w_i=d_i-q_i\),那么会变成 \(if(w_i<0) w_{i+1}+=w_i,w_i=0\)
那么我们维护所有 \(w_i\) 非 0 的位置,每次更新 \(w_i\) 后往后将 \(w<0\) 的推平,复杂度均摊是 \(n\log n\) 的
「JOISC 2019 Day3」指定城市
- sol:有结论:当 \(i\ge 2\) 时 \(S_i\subset S_{i+1}\)(用调整法可以证明),那么我们只需要每次选贡献最大的点就可以了
用线段树方便维护出贡献
「JOISC 2019 Day3」开关游戏
- sol:容易发现一定是先赋值再反转,那么我们 DP,维护到 i 时前面覆盖的是什么(0/1/2)
可以方便的知道 i 有没有反转进而算出贡献
「JOISC 2019 Day3」穿越时空 Bitaro
好题
- sol:首先将第 i 个的区间 \([l,r]\) 变成 \([l-i,r-i]\)
我们维护能到达的时间区间 \([L,R]\),若下一个有交,那么变成 \([max(l,L),min(R,r)]\)
否则,我们表示为 \((a,b,c)\),即进去是 a,出来是 b,代价为 c
注意到这些二元组,三元组是可以合并的,我们用线段树维护合并的结果即可
「JOISC 2019 Day4」蛋糕拼接 3
略
「JOISC 2019 Day4」合并
- sol:将能合并的点都合并过后,答案即为 \(\lceil\frac {cnt}2\rceil\),即用叶子覆盖所有边即可
「JOISC 2019 Day4」矿物
- sol:先用 \(2n\) 次分成两个集合,然后考虑将 \(A\) 中前一半点亮,\(B\) 中一个一个放进去查
次数为 \(1.5n\log n\),考虑到次数为 \(F(n)=(1+p)n+F(pn)+F((1-p)n)\),得到当 \(p\sim 0.4\) 时更优

浙公网安备 33010602011771号