首页 > 其他 > 详细

SSL-OI夏日合宿 2020.08.17 A组

时间:2020-08-17 22:26:53      阅读:95      评论:0      收藏:0      [点我收藏+]

SSL-OI夏日合宿 2020.08.17 A组

今天是他的生日,让我们祝他生日快乐!

这套题是北大爷不知道从哪里找来的, 只知道出题人署名是 HR

今天也是卑微爆0, 下次一定(?)认真打简单题&暴力

博客好久没更了, 主要是因为腐太多了? 还是要好好打一打题解的, 不然真的啥都没留下就退役了.

今天的代码估计要咕, 还是先打完博客梳理一下思路吧.

T1 图

题意

给一个n个点n条边的图, 边权表示所连的两点的权值和. 给出边权, 求点权.

正解

显然这是一棵基环树, 图中的环是一个\(k\)元一次方程组, 可以求解. 环上的点权解出后, 对于每棵树上的点权直接求出.

有关x元一次方程组的求解, 可以用高斯消元, 但在这道题中有更加简单的解法: 考虑到每个方程组只有两个非\({0}\)系数且系数都为\({1}\), 可以用钦定一个点\(x\)作为起点, 从它的一条出边开始遍历环, 将环上的\(k\)条边都表示成含\(x\)的式子. 显然, 当我们回到点\(x\)时,这条边上的方程只有变量\(x\)且系数为\({2}\).


T2 上升子序列

题意

给出一个数组, 要求将其分为两个上升子序列, 求两个子序列的差最小.(无解输出\({-1}\))

正解

考虑到每一个值都必须在某个上升子序列中, 那么对于每个逆序对, 都必在两个不同的上升子序列中. 所以对于每个逆序对, 我们连一条边, 然后跑二分图染色. 若染色不成功, 则数组不合法. 若染色成功, 图中会剩下x个连通块.

证明 每个连通块的值域没有交集: 若值域有交集, 前面一个区间的最大值和后面一个区间的最小值是一个逆序对, 必有连边.

对于每个连通块,会有一个固定的长度差. 得到每个连通块的差值后, 要使总差值最小, 只要DP每个数取\({+}\)或取\({-}\).


T3 大冰隙2

题意

给出一个序列, 每个元素\(i\)包含两个值: 种类 \({b_i\in\{0,1\}}\) , 数值 \({c_i<2^{30}}\).

支持两个操作:

修改: 单点修改某个元素的数值.

查询: 相邻两个种类为的元素会被消去(不计入答案), 某一段消去后其左右两边视为相邻. 求一段区间中没被消去的元素的最大数值. (无剩余输出 )

思路 (故事)

暴力的日子就要用暴力的解法.很显然这题是一个区间查询问题, 那么我们用莫队; 这题有修改, 那么我们用带修莫队; 这题合并不可逆, 那么我们用回滚莫队. 另外还要维护一棵平衡树(multiset)支持插入删除求最大.

综上: 这题可以用带修回滚莫\({N\sqrt{N}\log_2{N}}\)的复杂度获得?分的好成绩. (正常都是因为没打出来而爆0吧?)

正解1 树剖

我们发现有顺序的\({01}\)抵消很像出入栈顺序, 我们把一段\({01}\)序列视作某棵树的dfs序的一部分, \({0}\)表示向下遍历, \({1}\)表示向上回溯.
注意: 若有"多余"的\({1}\)则新建一个点作为新的根, 将旧的根作为其儿子.

如此建树后, 每棵棵子树内的所有点都没有贡献, 区间查询问题变成了树上两点间的路径最大值查询, 我们用树链剖分即可.
注意: 由于边权有向的, 设\(x<y\)有: 链 \({x}\)->\({LCA(x,y)}\)应取向上边权, 链 \({y}\)->\({LCA(x,y)}\)应取向下边权. 我们开两棵线段树分别处理向上/向下边权即可.


正解2 树套树

显然对于某段区间, 充分合并后只剩余若干个\({1}\)和若干个\({0}\), 形如\({111100}\).

我们维护一个线段树, 对于每个区间维护\({1}\)的数量和\({0}\)的数量, 再用线段树分别对于\({1}\)\({0}\)处理出区间最大值.

合并时两个区间中间同时消去\(min(0_{Left},1_{Right})\), 再将剩下区间的线段树合并.

SSL-OI夏日合宿 2020.08.17 A组

原文:https://www.cnblogs.com/mxxr/p/13519612.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!