IOI2021 国家集训队作业部分题解

读者本地应该都有由各个集训队员撰写的题解。本文旨在对其进行一些补充。
代码基本都能在cf gym的提交中找到,用户名zx2003(应该没人不知道吧。。。)WF2017-2019需要在loj上找,因为当时觉得loj交起来比较舒适。

WF2014

B

本题复杂度是可以优于yht给出 O ( w 2 log ⁡ d ) O(w^2\log d) O(w2logd) 的,虽然也没什么意思。
对于每种离散物品,将背包容量按模 w i w_i wi 的值分类后,每一类都是可以决策单调性优化转移的,写个分治就没了,对zx还写了这个,每一类都是个经典的斜率优化问题,维护个凸包就不必带log了。

E

这里提供一个严格正确的做法。
我们维护每个点的颜色表示其所属的等价类集合,然后迭代若干轮并不断更新每个点的颜色。
每轮迭代中,按照题意可以把每个点的新颜色表示为 vector<vector<int>> ,然后用个 map 映射回 int
如果一轮迭代后颜色数不变,则无需继续迭代。由于颜色数至多从n降为1,所以迭代只会进行至多n轮,这也证明了dxm题解中的结论。
我的实现方式复杂度高达O(n^5) ,但是莫名AC了。实际上稍微牺牲点正确性用点哈希能降不少复杂度。

G

这里提供一个优于 O ( n 3 ) O(n^3) O(n3) 的做法。
通过一些分析,可以变为有O(n)个决策点,每个决策点要往左二分查找最左的可行位置,判断需要2-SAT。暴力需要判定nlogn次,但是如果按随机顺序计算决策点,二分前先检查一下是否可能更新答案,就只用判定O(n)次。2-SAT可以kosaraju+bitset优化,这样就得到了优秀的 O ( n 3 w ) O(\frac{n^3}{w}) O(wn3) 做法。
zjc给的做法是floyd,需要动态维护最短路,不确定是否能过通过压位或者四毛子做到优于n^3。

H

题本身没什么意思。主要是介绍一下一个通用性更强的网格图上高消实现方式。
网格图对应的矩阵M,性质可以弱化为若 M i , j M_{i,j} Mi,j 非0,则 ∣ i − j ∣ |i-j| ij 小于一个定值L。
然后我们改造一下矩阵存储方式,每行只存一段非0的长为 O ( L ) O(L) O(L) 的区间,重载个数组类即可做到这一点。然后跟普通高消一样写,稍微注意下循环上下界就行了。

L

这里提一下我一开始写的时候漏掉的细节。
对于平面图的一个连通分量,它的外部不一定与无穷远处相连通,也可能是被另一个连通分量的某个面给包裹着。听起来很显然但是小蒟蒻zx一开始就是没考虑到调了一年。

WF2015

G

首先要观察出决策树的结构。之后题解做法是(相对于我的做法)倒着弄,正着弄比较麻烦,我的办法是直接维护决策树上剩余节点构成的二叉树森林,每次贪心修改,复杂度应该比题解多log。具体细节忘了,感兴趣的话可以看我代码。

NEERC2017

F

写烦了导致一个1K题调了4h,唯一聊以自慰的地方是所有for循环都可以显式地O(1)计算,闲的蛋疼的对O(1)算答案感兴趣的人可以去看一下,讨论情况可能有点多。

NEERC2015

H

四维空间里的一个超立方体有16个顶点,每个顶点坐标取值都是0/1。一个立方块的八个顶点坐标满足,四维坐标中有一维均为定值。而两个立方块的交是一个平面,满足四维坐标中有两维均为定值。
任意钦定一个立方块八个顶点的坐标后可以递推出其它立方块的顶点坐标,顺便也完成了判定过程。
不过挺好奇的是这种题出题人怎么造数据的。

NEERC2013

C

这里给出一个严格正确的做法(无哈希)。
首先将重心提根。我们尝试给圆方树上每个点的子树赋一个字符用以描述同构关系。对于一个圆点,将其所有儿子的字符 sort 后可以看作一个字符串;对于一个方点,将其所有儿子的字符按序拼接得到串S后,取min(S,rev(S))也可以得到一个字符串。对于一个字符串,我们可以将其看作一个新的字符,并将得到的新字符赋给该点。维护所有字符串的集合需要个trie。
注意在根上需要处理循环同构,要跑个KMP。

CERC2016

G

首先可以将问题转为查询若干个矩形,要求返回结果形如

struct info{
	long long be,en;
	bool bo;
	vector<pair<long long,long long>>v;
};

其中 been 分别表示该矩形对应区间开头和结尾的极长0段,v 表示极长1段的长度及对应数量。
显然 info 是可合并的,直接按定义递归即可,剪枝加满就A了。要加的剪枝还是挺多的,详见代码吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值