JOISC2019 题解

LOJ3030「JOISC 2019 Day1」考试

显然的三维数点。

LOJ3031「JOISC 2019 Day1」聚会

这题很 emmmm 啊……

一个其实比较显然的随机做法:随机两个点 \(x,y\) ,对于每个点 \(z\) 询问 \((x,y,z)\) ,即可知道它是在链上还是在链上的某个点的子树里。

对于链上的点可以用 stable_sort 找出之间的顺序,子树内的递归处理。

不知道期望多少次,但是过了。

这里还有一个做法,但是没有看懂……

LOJ3032「JOISC 2019 Day1」馕

反正我想不到 /kk

对于每个人求出对于他来说把 naan \(n\) 等分的分割点,然后每次找到还没有确定位置的人里面第 \(i\) 个分割点最小的人,把他放在这里。

正确性很显然。

LOJ3033「JOISC 2019 Day2」两个天线

这题不会,脑子没了……

由于是求绝对值的最大值,所以不妨把贡献设为 \(i<j,H_i-H_j\) ,然后再把 \(H\) 取相反数即可。

离线,从左往右枚举 \(r\) ,也就相当于是枚举 \(j\)

对于一个 \(i\) ,只有 \(j\in [A_i+i,B_i+i]\) 的时候才是可用的。

而对于 \(j\) ,相当于是对 \([j-B_j,j-A_j]\) 里面可用的 \(i\)\(H_i-H_j\)\(\max\)

然后可以线段树维护:线段树的一个节点维护最大值、区间可用的 \(\max H_i\) 、区间能贡献的最小的 \(H_j\)

LOJ3034「JOISC 2019 Day2」两道料理

竟然切了,那就不写题解了。

https://loj.ac/submission/856564

LOJ3035「JOISC 2019 Day2」???

你LOJ又咕了

题面可以看 https://www.cnblogs.com/zhoushuyu/p/10585809.html题解也可以去那里看

考虑两边一起做 dijkstra ,那么每次需要知道两边分别扩展出的最近点是谁,以及距离是多少,然后选择较小的那一边扩展。

那么需要转移的 bit 是 \(kn\) ,其中 \(k\) 不是很小。

但不管怎样,数量级已经对了,所以尝试把 \(k\) 压小。

一个优化是:先互相传最小距离,然后距离更小的那一边把点的编号传过去。

但是由于距离比较大,还是卡不进去。

发现其实可以传 \(d'=d-lastd\) ,即比上一次多了多少。显然这个值不超过 500 。

所以可以做到 \(29n\) 个 bit 做完。

LOJ3036「JOISC 2019 Day3」指定城市

口胡:

不搞那些花里胡哨的,直接上树形DP:\(dp_{x,i}\) 表示 \(x\) 子树中选 \(i\) 个,得到的最小代价。

这里的最小代价的意义:假定子树外还会有特殊点,且只考虑子树内的边的贡献。

显然在 \(x\) 不是叶子的时候选 \(x\) 没有任何收益(对于这个dp来说),所以不考虑它。

所以转移就是给每一个儿子的 \(dp_{v,0}\) 加上 \((x,v)\) 的代价,然后 \((\max,+)\) 卷积合并。

所以容易发现 \(dp_x\) 是凸的,可以用可并堆维护差分,然后 \(O(n\log n)\) 合并。

但是怎样统计答案呢?

点分治,然后钦定根在虚树中即可。在根处合并的时候钦定至少有两个儿子有特殊点,也就是强制选两个最大的 \(dp_{v,1}-dp_{v,0}\)

当然还有一种情况没有考虑到,就是所有特殊点都在一个子树中,而根也是特殊点:这种情况对于每一棵子树单独处理一下即可。

复杂度应该是 \(O(n\log^2 n)\)

正解当然不是这个……

对于选一个或两个的,可以直接树形DP。

对于选更多的,有一个结论:\(S_i\subseteq S_{i+1}\) 。所以可以直接贪心选贡献最大的。

这个结论我好像见过,但是忘掉了……关于证明其实可以看上面那个dp的过程,两者本质上好像是差不多的,只不过上面的做法强行定了一个根,所以正确性就看起来没有问题了。

也就是说,在钦定了根的情况下,这个贪心等价于上面的DP。

所以我还是不会证贪心的正确性

LOJ3037「JOISC 2019 Day3」开关游戏

先可以注意到一个性质:在操作序列中,如果相邻两个是先区间反转再区间赋值,那么可以通过一些变换使得把两者顺序调换。

所以必然存在一个最优序列,使得前面都是区间赋值,后面都是区间反转。

在只有区间反转操作的情况下,令 \(c=a\oplus b\)\(a,b\) 是起始序列和目标序列 ),则答案就是此时的极长 1 段的个数。

区间赋值操作显然互不相交,所以一格一格DP过去即可。

\(dp_{i,0/1/2}\) 表示 ¥%¥¥……&……%*@ ,然后随便转移。

LOJ3038「JOISC 2019 Day3」穿越时空 Bitaro

暴力做法很明显:只往目标点方向走,能走就走,不能走就等/穿越。

下面只考虑从左往右走。

为了方便,给每个区域一个“时差”:把走到 \(i\) 点的时间减去 \(i\) ,这样走路的时间就变成 0 了。(当然不做这个转换也是可以的)

对于一条路,会有两个分段函数:一是 \(f(x)\) 表示在 \(x\) 时间走进去什么时候能出来;二是 \(g(x)\) 表示 \(x\) 时间走进去需要调整多少次。

显然 \(f(x)\) 是两段平,中间 \(f(x)=x\) ;而 \(g(x)\) 是前面平,后面一个斜率为 1 的一次函数。

合并两条路,发现这样的形式不会改变,所以就可以线段树维护了。

LOJ3039「JOISC 2019 Day4」蛋糕拼接 3

险些暴毙 /fad

注意到选出来的蛋糕的顺序可以自己定,那么容易发现最小的代价即为 \(2(\max C-\min C)\)

所以把蛋糕按 \(C\) 排序,那么就是要选出一段,最大化区间中前 \(m\) 大的 \(V\) 之和减 \(2(C_r-C_l)\)

考虑区间 \(m\) 大,可以发现对于 \(l_1<l_2\) ,多加入一个 \(r\) 的时候,给 \(l_1\) 带来的收益小于等于 \(l_2\)

因此,当对于某一个 \(r_0\)\(l_2\)\(l_1\) 更优时,对于所有 \(r\ge r_0\)\(l_2\) 都比 \(l_1\) 更优。

这就是决策单调性的定义,所以可以分治求出对于每一个 \(r\) ,它的最优的 \(l\) 是谁。

LOJ3040「JOISC 2019 Day4」合并

先把原树中不合法的边挑出来。

把这些边断掉之后,剩下的连通块可以缩成一个点。然后再把这些边连回去。

此时相当于树上的每一个点的颜色都不相同。可以发现这棵树是等价于原树的。

合并两个点时,它们之间的路径会被缩到一起。

显然一次最多缩起来两个叶子,所以答案下界是 \(\lceil {leaf\over 2}\rceil\) ,而这样一组解也很容易构造。

LOJ3041「JOISC 2019 Day4」矿物

如果 \(i,j\) 匹配,那么在 \(i\) 在机器里时 \(j\) 怎么变种类数都不会变化,否则怎么都会变化。

容易找到一些 \(O(n\log n)\) 的做法,但是绝大部分由于常数太大被卡掉了。

以下照搬题解。

先用 \(2n\) 次操作,可以把所有石头分成两个集合,使得同一个集合的石头互不相同。

分治,从 \(A\) 集合中选 \(pn\) 个进行 query 操作,然后把 \(B\) 集合依次 query ,即可知道这里面哪些和那 \(pn\) 个是配对的,然后递归。

注意 query 操作不需要撤销也不能撤销,否则常数就炸了。

总共用操作数为 \(F(n)=F(pn)+F((1-p)n)+(1+p)n\) ,不知道为什么在 \(p={3-\sqrt 5 \over 2}\) 时最优。操作次数大约 980000 次。

posted @ 2020-07-15 16:02  p_b_p_b  阅读(1693)  评论(0编辑  收藏  举报