[关闭]
@SovietPower 2019-03-14T12:40:50.000000Z 字数 11501 阅读 1426

3.2 青岛正睿 Day1 构造

正睿OI



URAL 1979 Resources Distribution(构造)


给定。你需要对一个的立方体,在外表面的个面上写上这些数字,使得从任意格子出发向任意一个方向走一圈和都相等。


考虑一个面和其对面同样位置的面,一定会同时出现在某个环中。
所以令任意两个相对的面的和相同。设成就好了。


CF.226D.The table(构造)


给定一个的矩阵,每次可以将一列或一行取负。求一个方案使得若干次操作后,每行每列的和都非负。


容易想到每次找和为负的一行或一列取负。这样做正确性及复杂度会有啥问题么?
注意到每次取负,所有数的和是单调递增的,所以一定会结束。且每次和至少会增加),而所有数的和最小是,最大是,所以最多操作次,复杂度
自己写了写,写的真是麻烦。。不需要queue,每次for一遍反转行列即可。
https://www.cnblogs.com/SovietPower/p/10462907.html


Andrew Stankevich Contest 44 (ASC 44) H.Huffman Codes


给出个哈夫曼编码的个数,问是否存在可能的哈夫曼编码(满足这个数)。


首先相同的肯定在同一深度,且同一深度一对比另一个数多比另一个数少的两个数一定匹配,把它们合并即可。这样一直下去直到构造完成或出现矛盾。


CF.209C.Trails and Glades(构造 欧拉回路)


给定一张个点条边的无向图,允许有自环重边。求最少加多少条边后,其存在从出发最后回到的欧拉回路。
注意,欧拉回路是指要经过所有边,无边(边包括自环)连向的孤立点不需要考虑。但是一定要经过。


如果图连通,奇度数点两两连边即可。
如果图不连通,对于每个奇度数点需要向外连一条边;没有奇度数点的连通块就随便找一个点往外连两条边。另外强制选即可。
答案是统计的边数除以
https://www.cnblogs.com/SovietPower/p/10463381.html


ZOJ.3823.Excavator Contest(构造)


的网格上,由边界的某个格子出发四连通地经过所有格子恰好一次再回到边界上,要求拐弯的数量至少有次。


嗯...在边界各种绕然后变成规模更小的问题?


Latvia U Contest 14 G.Mosaic(构造)


有三种颜色的珠子各个。求给出方案铺满若干层的正三角形,且三角形的每层颜色必须相同。

首先必须是三角形数,否则无解。设,即有层。
关于方案构造,第一想法是贪心,每次把最多的放到最下一层去,但显然有反例。尝试做一些修正。
首先可以特判如果存在两个或两个无解。
时,合法方案有哪些很好判。
时,由,可知
考虑枚举每一层,若,则放;否则称这一层为可选择的,先放
这样我们能放到。因为,所以此时不合法的情况只有
若之前存在可选择的层,那么找到最小的可选择层颜色必然不同,且交换这两层后仍然合法,状态变成。这样就了。
所以除去存在两个或两个的情况,只要是三角形数,就一定存在合法方案。


NEERC2013 K.Kids in a Friendly Class(Erdős–Gallai定理)


一张图有黑点和白点,每个黑点有条边与黑点相连、条边与白点相连;每个白点有条边与黑点相连、条边与白点相连。给出,构造一张满足条件的图使得总点数最少。


枚举黑点点数,那么白点有个,黑点白点之间的边可以瞎连,很简单。
对于同色点,问题就是如何连边使得每个点的度数相等。
每次选剩余度数最大的两个点连显然是错的(比如)。
每次找一个剩余度数最大的点,向剩余度数次大的若干点连,就OK了。
其实就是Havel–Hakimi算法或者Erdős–Gallai定理。这种方法可用于构造任意给定每个点度数的图。
范围这么小...怎么写都行了。
而且貌似不需要枚举...可以算出来具体的在这里有代码,懒得看.jpg。


Udmurt SU + Izhevsk STU contest J. Cranes(思路 贪心)


给定。你需要把个箱子从移动到。你可以用个机械手,每个机械手同一时刻只能拿一个箱子,可以在一单位时间内向左或向右移动一格,或者不动,机械手提起/放下箱子的时间忽略不计。求将个箱子全部移到的最短时间。


手算一个数据体会一下...
都能算出来...答案是
一种方案(不唯一):
机械手:把一个送到,回到再拿一个;
机械手:把一个送到,再回到拿一个;
机械手:把一个送到,再回到拿一个。

首先假设机械手数量小于等于箱子数量。每秒对机械手采取这样的贪心操作(先考虑离较近的机械手):
1. 如果有箱子在自己后面且没有被抓着,扔下手中的箱子往回走一步。
2. 否则当前位置一定有没被抓着的箱子,抓起它向前一步。
证明:这样可以使得所有手往回走的步数最少。

然而我好像还不会线性做法...貌似可以推个式子。


Ufa SATU + Bucharest U Contest J. Reverse Sort(归并排序)


给定一个长为的序列,每次可以反转一段区间,代价是区间长度。在总代价不超过的条件下将该序列排好序。


就是这道题,那里写的更详细。
假设值域只有,可以从小区间到大区间归并排序,代价/复杂度是的(归并还有的常数)。
扩展到一般情况。每次取一个的数设成的数设成,每次可以区分两堆数。那么复杂度是的。

另外有一种贪心,就是每次交换相邻的两段,比如:10101010->01010101->00101011...。直接这样复杂度是的。
考虑仍是每次交换相邻的两段,但间隔一段10101010->01100110->00011110->00001111。可以发现开头的个数呈几何增长(我没发现),所以复杂度。但是应该比上面那个难写...但是这个思想应该(可能)很常用。


Andrew Stankevich Contest 42 C.Comparator Networks(构造)


一个比较器会比较这两个位置的比特,若则将交换。
一个比较器网络是一系列依次执行的设定好参数的比较器。
一个比较器网络对某个比特序列(即一个序列)是排序的,当且仅当输入这个比特序列的输出是单调递增的。
构造一个比较器网络(比较器数量),使其对于给定的长为序列是非排序的,且对其他的所有序列都是排序的。无解输出-1。

如果输入序列已经排好序显然无解。否则最前面那个一定在最后面那个前面。
令最后一个的位置是,固定,把除外的任意一对位置放一个比较器,即把其它所有位置排好序。
然后令当前第一个的位置是,固定,把除外的所有位置排好序。
这样对于初始序列,位置上的一定在最后面那个的前面,所以是非排序的。
而对于其它任意序列,按的个数和给定序列的个数的大小关系分类讨论,可以发现是能排序的。


CodeChef Dec 14.Divide or die


给出平面上一个的度角(给三点坐标,是整数)。求一个方案通过尺规作图将其等分。无解输出

我粘ppt了...

世界人民熟知不能三等分任意角...?
由大数学知,尺规扩张是最多是二次扩张。而三等分度角需求解的多项式是三次的,故度不可三等分。

考虑尺规直接画能画出什么度数的角。

度/度与度不可三等分矛盾(否则就可以画出度角了)。
度角可以画出,利用角度的加减法,任何不是的倍数的整数度角都可以被等分,而所有的倍数的角由于可被直接画出必然不能被等分(要利用给定角的两条射线画图)。

考虑怎么画度角。
利用黄金分割三角形度底角!
可通过直角边长为的直角三角形得到。
度四等分得到度,等边三角形度四等分得到度,相减得到度角。


World Finals 2014 A.Baggage


初始序列为(长度为).每次可以移动相邻的恰好两个元素到某两个连续空位,求一个方案在最少次数内将其排为。序列的最左最右边算有无穷多个空位。

(如果能)最好还是先打个表看看规律...
看图...

貌似出现的时候比较特殊,可能要判一下...


CF.468C.Hack it!(构造)


表示整数在十进制下各个数位的数字之和。给定,求两个整数,使得
,保证存在解。

考虑一个简单的性质:
不妨令,设
由上面的性质可知,
同理还有:(都是模意义下)。
然后就可以构造出。所以令就可以啦。
有个问题是求。展开一下:

这样就做完啦。

还有个做法是,考虑有。枚举,如果有,令等于这个数,就有了。
需要预处理一下,因为是上限的幂所以算一下每个数出现次数即可(或者像上面一样直接算)。
https://www.cnblogs.com/SovietPower/p/10517540.html


CF.487C.Prefix Product Sequence(构造)


对于一个序列,定义其前缀积序列为
给定,求一个的排列,使得该排列的前缀积序列是的一个排列。无解输出


考虑无解的情况。因为,所以
为质数显然可以满足。否则设
,那么有,GG了。
,当时,,所以也有,GG。
所以为大于的合数时无解。特判一下

首先要填要填
考虑能不能直接让前缀积序列变成。那么
只需要判断是否有
稍微化一下,,而我们知道每个数的逆元是唯一的,所以这么做就OK啦。
https://www.cnblogs.com/SovietPower/p/10518469.html


CF.618F.Double Knapsack(构造 鸽巢原理)


给定两个大小为的可重集合,集合中的元素都在内。你需要从这两个集合中各选一个非空子集,使它们的和相等。输出方案。


求子集是假的...对两个集合按任意顺序求个前缀和,记为。不妨假设
那么能发现,对于每个,找出最大的的取值范围是(如果则可以移动),只有种。而的取值有种。由鸽巢原理,那么一定存在一对,使得。因为元素大于,所以
那么有,就可以得到答案啦。
https://www.cnblogs.com/SovietPower/p/10519255.html


ONTAK2014 SUM(构造)

题面:https://sio2.mimuw.edu.pl/c/wiekuisty_ontak2014/p/sum/
备份:链接: https://pan.baidu.com/s/1Nt3mZUXJpcG_S80i2ky_7w。提取码: nx2d。


给定一个大小为的正整数集。你要求一个大小不超过的集合,满足中每个元素都是中某个子集的和,且中所有子集的和两两不同。中每个元素的大小不超过


考虑将问题缩减到更小规模的方法。
设当前集合中最小的奇数为,将中所有的奇数减去,然后将从集合中删掉。
剩下的数都是偶数,将它们除以后去重,递归下去。
当递归到集合为空时,开始递归回去。
递归回去时每次把中所有元素乘,如果这层删掉过奇数,就在中加入

考虑这样的过程为什么能满足条件。
每次向中加入的元素都是中的元素,且中删掉的元素一定会被加入到,所以满足第一个条件。
模拟递归回去的过程来证明第二个条件。
当递归到最后时,空集满足条件二。
那么递归回来时是满足条件二的,那么将中每个元素乘,仍满足条件,且此时中全是偶数。
若这一层加进去了奇数,那么新产生的子集和都是奇数,和之前全是偶数的子集和一定不相同。之前的子集和互不相同那么新产生的子集和也互不相同。那么依旧是满足条件的。


CF.578E.Walking(构造)


给定一个长为的足迹序列(只包含两种字符),你需要这样交替在上走(第一步可以选择也可以选)。当你在时,下一步可以走到任意一个没走过的;在时,下一步可以走到任意一个没走过的。求走完这个序列最少需要往回走几次,并输出方案(往回走是指从位置走到位置)。保证存在一组可行方案。


首先数量差大于无解。
如果我们需要往回走次,那么我们可以将序列分成个分别合法的子序列。
反过来,如果我们能将序列分成个合法的子序列,小于往回走的次数是不是一定小于
考虑能否证明。我们将序列分成四种合法的子序列(第一个字符表示序列开始是什么,第二个字符表示序列末尾是什么,因为只需要关心首尾字符),假设四种子序列分别有个。首先有
然后我们可以用不超过步将所有合并成一个序列,这个序列可能是四种中的任意一种。
还可以用不超过步将所有合并成一个。对同理。这样我们就得到了一个和一个子序列。
如果把其中一个子序列的最后一个字符给另一个,就可以变成一个和一个,且不会增加次数。
那么不论刚开始合并出的子序列是哪种,都可以用不超过两步拼接上剩下的两个子序列。
这样最多使用步。这样就证明了,如果我们能能将序列划分成个合法子序列,一定可以构造方案使得最多往回走次。(可是我还是觉得有点迷...)

现在的问题是怎么讲序列划分成尽量少的合法子序列。
我们发现可以跑最小路径覆盖(每个向它后面所有连边,就是答案)(图在官方题解里有)。
但还可以发现这个匹配实际上可以直接贪心,每个字符选它能匹配的点中最靠前的匹配即可。因为一定可以调整最大匹配使得满足这种贪心。
那么复杂度就是的了。
具体做的时候,可以拿个栈模拟一下拼接...(菜到不会写.jpg)
https://www.cnblogs.com/SovietPower/p/10523753.html


CF.472F.Design Tutorial: Change the Goal(构造 线性基 高斯消元)


给定两个长为的数组。每次你可以选定,令可以相等)。要求若干次操作后使得变成,输出方案。操作次数不能多于,无解输出


考虑异或的两个基本性质:
1. 异或是可逆的,逆运算就是它本身。
2. 可以交换两个数:a^=b,b^=a,a^=b

考虑线性基。构造出的线性基,如果中存在元素不能被表示出来,那么无解。
我们发现对于不在线性基中的元素,得到是很容易的,只需要求一下在线性基中需要异或哪些数。
对于在线性基中的元素,设有个,它们之间不是很好做。把对应的需要哪些基写成一个位二进制数。由第二个性质,我们可以高斯消元将这个的矩阵消成一个上三角矩阵,这样从高位到低位做不同基之间就互不影响了,我们可以出这个矩阵。
而由第一个性质,将高斯消元的过程反过来操作这个上三角矩阵,就可以还原回数组。
https://www.cnblogs.com/SovietPower/p/10528796.html


CF.612E.Square Root of Permutation(构造)


给定一个的排列,求一个排列,使得对于任意。无解输出


对排列我们建一张图,边为。显然这张图是由几个环构成。
发现对于的图,原来中的奇环它们还是那样一个奇环,原来偶环的会分裂成两个大小相等的偶环。
所以对建图,找出里面的环,是奇环就把相邻点间隔为地插入到环里,是偶环就找到和它一样大的一个合并,找不到就无解。这样就可以得到的图了。(每个偶环只能合并一次→_→)
复杂度
https://www.cnblogs.com/SovietPower/p/10528010.html


一个正边形...然而不知道题目名称是啥,说的课件修正版咕咕了。


CF.715D.Create a Maze(构造)


给定。在的每次可以从走到。现在你需要在图中删去若干条边,使得从走到的方案数为。删边是指,可以使某个不能走到
如图:
,删去的边数不能超过

容易发现如果以的方案数进入某个格子,我们可以花的代价将它隔成的方块,出去时的方案数就是
所以可以考虑二进制分解。至于的实现,就可以从最上面引一条路径到对应位置去。
但是由于限制比较紧,二进制分解是不够的。
考虑用的方块构造。那么就是个进制,我们需要能

如图,如果我们保留右边第列的横边,可以令方案数;保留第列的横边,可以令方案数,这两个互不影响。左边的两条竖边同理。这样我们用一个类似引水渠(?)的构造就可以实现了。


CF.566E.Restoring Map(构造)


对于一棵树,定义某个点的邻居集合为所有距离它不超过的点的集合(包括它自己)。
给定个点的邻居集合,要求构造一棵个点的树,使得每个给定的集合都对应一个点。输入保证有解。


如果两个点的邻居集合大小为,那么交集中的两个点之间一定有边。这样我们就可以确定出非叶节点以及它们之间的连边。
然后考虑叶节点应该挂到哪里。如果一个叶节点的邻居集合,和距离某个非叶节点不超过的点的集合相同,那么这两个点之间有边。对于叶子,所有包含的邻居集合中最小的一定就是的邻居集合。一个点数的树,离某个点距离不超过的点的集合是互不相同的。
需要特判非叶节点只有一个和两个的情况。

官方题解是,找出叶子的邻居集合,如果除去集合大小,那么在集合内度数的点就是与相邻的。否则集合大小是,这种情况有些难判,但是与相邻的点一定只与一个非叶节点相连。所以我们只需要特判这种情况。
还有种并查集的写法,太傻逼了看不懂了QAQ。
https://www.cnblogs.com/SovietPower/p/10531749.html


Special Tour(Asia Hong Kong Regional Contest 2016)


给定一个的网格,将曼哈顿距离为的格子之间连一条边,求一条曼哈顿回路。无解输出


没讲,咕咕咕。


HDU.4700.Flow(构造 最小割树)


给定以及个点任意两点之间的最大流,求一张无向图满足给定条件。


有些类似最小割树(可能)。
我们可以构造一棵树,只要让树上的边成为割边,非树边容量为就可以了。
每次找到当前点集中流量最小的边,设其流量为,然后根据将点集分成两个集合,满足两个集合之间的点对的最大流是,集合内部的点的最大流。对于集合内部继续递归做即可。
划分集合的时候也是可以先随便找一个点划分到左集合,将的点分到左集合,其余的点分到右集合,再判断一下左右集合是否满足之间的最大流即可。注意右集合为空时也无解(,这样显然不行)。
复杂度
注意别写成。。
https://www.cnblogs.com/SovietPower/p/10533310.html


TCO2017 Round3 HiddenRabits(2-SAT 树形DP)

...?
(或者到达都需要经过?)
网上唯一的题解...



添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注