opentrains1498训练实录

opentrains 1498训练记录

Petrozavodsk Winter-2017. Asia-Tsukuba 2016

2019.4.19打,2019.4.21补:

自补,由于网上貌似没人写过题解,我就写一个

A.Rearranging a sequence

一开始你有一个从$1-n$的数列,然后又$m$次操作,每次将$a_i$放到数列最前面,输出最后的数列

$n\leq 2·10^5\ m\leq10^5$

简单题,相当于求最后每个数字的位置,相当于一开始是空序列,先将$n-1$依此插入队首,然后进行那$m$次操作,那么对于每个数字$i$,考虑最后一次提拔他是在第$b_i$次,那么$[a_{b_i+1},a_{n+m}]$中有多少种不同的数字,在最终数列中就有多少个数字在$i$前面

$O(n+m)$

B.Quality of Check Digits

题意很狗

枚举题意做题。

垃圾模拟题,然而猜题意读题意很麻烦

不讲了,这题可能来源于某种工程算法

C.Distribution Center

有$n$条运载线和仓库,第$i$个仓库就是第$i$个运载线的终点,每条运载线的$x$坐标是$[0,10^5]$,有$m$个机器人,第$i$个机器人有两个属性$x_i,y_i$,表示这个机器人$x$坐标是$x_i$,你可以用它在这个$x$坐标上将$y_i$运载线上的货物换到$y_i+1$运载线的同坐标或者从$y_i+1$换到$y_i$。保证机器人$x$坐标两两不同,运载是将货物从$x=0$送到$x=10^5$的,求每个仓库可能收到多少个运载线送来的货物

$n\leq 2·10^5\ m\leq10^5,x_i\leq10^5,y_i\leq n$

$solution$:每个运载线的货物能运到的仓库是一段区间

按照机器人$x$坐标从大到小$dp$,$dp[0/1][i]$表示货物在$x_i$上的运载线$y_i$处,能到达的仓库编号区间的左端点右端点,$dp$时动态维护每个$y$上$x$坐标最小的机器人编号即可转移。把每个运载线货物能到达的一段区间的答案$+1$,普通的前缀和过程

$O(n+m)$

D.Hidden Anagrams

给定两个长度小于$4000$的字符串,求最长的公共同构子串的长度

公共同构子串:两个子串$A,B$如果能将$A$重排列变成$B$,那么称$A、B$同构

用一个$26$元组描述一个串,表示这个串中每个字母的数量,称为串的特征值,那么同构当且仅当特征值相同。

枚举长度,枚举$A、B$中的串,将特征值哈希然后在哈希表里找同构串即可,用前缀和优化便可$O(26)$计算任意长度子串的特征值的哈希

$O(26nm)$

E.Infallibly Crack Perplexing Cryptarithm

剪枝搜索,不是我喜欢的类型,不补了

F.Three Kingdoms of Bourdelot

$U=[1,sum]$,有一个定义在$U\times U$上的关系$\leq$,满足传递性和反对称性

给出$n$个文件,每个文件含有$m_i$个二元组${x_{ij},y_{ij}}$

这表示,对这个文件里的每个二元组,要么同时有$x_{ij}\leq y_{ij}$,要么同时有$x_{ij}\nleq y_{ij}$

给出$p,q\in U$,求有没有一个关系,满足所有文件的需求以及满足$p\leq q$

$sum\leq 300,n\leq1000,\sum m_i\leq10^5$

空的关系一定是合法的

但是他不能是空的,因为我们强制要求$(p,q)\in F$,下文我们设关系的集合是$F$

$F$中有$sum^2$中可能的元素,我们从$(p,q)$进行$bfs$,就表示$F$中必须有的元素,有这么几种转移:

设当前在$F$中的元素为$(a,b)$

$1.$若有$(a,b)、(c,d)$属于某个同一文件,则$(c,d)$一定属于$F$

$2.$若有$(b,c)$属于$F$,则$(a,c)$属于$F$

$3.$若有$(c,a)$属于$F$,则$(c,b)$属于$F$

$bfs$完成后,检查是否满足反对称性是否满足即可

证明:

1.对于传递性,$bfs$中有转移

2.对于文件的捆绑也有转移

$O(\sum m_i+sum^3)$

G.Placing Medals on Binary Tree

有一颗无穷满二叉树(每个点都有两个儿子),现在有一个长度为$n$操作序列,

每次找一个深度为$x_i$的点,将这个点涂黑,要求任意时刻任何黑点到根的路径上不能包含其他黑点。如果没有符合要求的点就不考虑这个操作,否则一定要做这个操作,那么最后会形成一个长度为$n$的$0/1$串,$0$表示这次操作做了,$1$表示没有做,求一个可能的字典序最小的$0/1$串

$n\leq 5·10^5,x_i\leq10^9$

设$a_i=2^{-x_i}$,那么对于一些操作,如果这些操作的$a_i$的和小于等于$1$,则这些操作可以一个不漏地操作,因此由于字典序,我们只需维护当前已选择的$a_i$的和,如果这个和加上新的$a_i$小于等于$1$则把$a_i$选上,否则不选

证明:考虑将这些$a_i$从大到小涂色,将这个树看成实数域$[0,1]$的线段树,染色时贪心地尽量走左儿子直到找到符合条件的点,易看出以上条件成立

因此:

算法1:将目前的$a_i$和写成二进制小数的形式,用平衡树维护和的每个为$1$的位置,当插入一个数时,暴力进位,由势能分析可得复杂度$O(nlogA)$

很遗憾,这个算法被卡常了,普通$set\ tle\ on\ 6$,用$unordered_\ set$在第七个点超时

算法2:还是将和写成二进制小数,这次,用平衡树维护每个连续的$1$的段,插入时考虑清楚段的分割、消除、合并。能合并一定要合并,否则复杂度不对

写了一年,WA两发,有几种坑

1.要注意$lower\ bound$到$end$指针时,也得考虑前驱元素是否需要修改

2.要注意尽量不要$erase$一个指针,因为可能出现得到指针->修改平衡树->删除原指针,但这时平衡树的结构已经变化,指针指向的元素已经不对了,正确的姿势是:得到指针->保存指针元素->$erase$这个元素

3.分类讨论签完不要漏

过了,也算是锻炼了$STL$平衡树的技巧

H.Animal Companion in Maze

给一张混合图(掺杂有向边和无向边),求最长路。同一条边不能连续经过两次

若有环输出$infinite$

$n,m\leq10^5$

先考虑所有的无向边,那么,将无向边加完后,一定是一个森林(否则有环,直接$infinite$)

这一步需要用到并查集

然后将森林中的每颗树缩成一个点,然后把有向边加进去,注意我们已经缩点,有向边的端点指缩点后的点

将这张有向图拓扑排序,如果没有拓扑序,说明有环,直接$infinite$

这一步需要拓扑排序

然后我们就按照拓扑序$dp$,就是个$DAGdp$,但是注意,我们是按照缩点拓扑序,也就是按照无向联通块的拓扑序,但我们需要求出真正从每个点出发的最长路,因此我们需要对每个联通块做树$dp$

我们得做两遍树$dp$

第一遍,考虑第一步往子树走或者走有向边出去

第二遍,考虑第一步往父亲走

记录每个点在树中的深度,无向边的路径长度可以写成树上差分的形式,而其他有向边的路径长度直接加在这颗树的点上,有一点点繁琐,就可以大力$dp$了

这一步需要树$dp$

板子已留

$O(n+m)$

I.Skinny Polygon

构造一个多边形,要求:

1.是三角形或四边形

2.点的坐标为整数

3.面积不超过$25000$

4.最小的能框住它的矩形长为$x$,宽为$y$

每个测试点$n$组数据

$n\leq10^5,x,y\leq10^9$

构造题,分类讨论:

若$gcd(x,y)\leq50000$,则找到一个点$A=(u,v)$

使得$2S_{\Delta ABC}=gcd(x,y)$即可,其中$B=(0,0),C=(x,y)$

$2S_{\Delta ABC}=xy-uv-(u+x)(y-v)=xv-uy$

简单数论可得$xv-uy=gcd(x,y)$一定存在$v\in[0,y-1],u\in[0,x-1]$的解

这个三角形即位所求

若$gcd(x,y)>50000$

设$x’=x/gcd,y’=y/gcd$,则设$A(0,0),B(x’,y’),C(x-1,y),D(x,y-1)$

$S_{四边形ACBD}=xy-\frac{1}{2}[(x-1)y+(y-1)x+x-x’+y-y’]=\frac{1}{2}(x’+y’)$

$x’,y’\leq10^9/gcd\leq20000$

这个凹四边形即位所求

J.Cover the Polygon with Your Disk

给一个凸包,和一个半径,求一个圆使得它拥有给定半径且和凸包的面积交最大

凸包点数$\leq10$,值域$\leq100$

一看这个题,数据范围好水

决策肯定可以模拟退火啊

甚至是个凸包,三分套三分肯定可以啊

三分套三分肯定更好啊,毕竟是复杂度确定正确性也确定的算法

求一个圆和凸包的面积交

1.求出所有圆和凸包的交点

2.逆时针扫,看每段弧在凸包外还是凸包内,算面积,在凸包的这段折线上随便选一个点看看在圆内还是圆外即可,因为同一段折线一定同时在圆内/外

3.特判一波两个图形完全覆盖的情况

想到这三个case

ddd说很难写就是了

复杂度$O(nlog^2A)$

K.Black and White Boxes

有$n$堆石子,第$i$堆有$a_i$个,石头是从上到下摞起来的。每个石头是黑色或白色,黑人白人玩游戏,轮流进行,黑人每次选一个黑石头,将这个石头以及所有它上面的石头拿走,白人每次选一个白石头,将这个石头以及所有它上面的石头拿走,谁不能拿了谁输。现在这$n$堆石头是候选石头堆,你要选出一些堆然后让黑人白人用这些堆玩游戏,称这样一个选择是公平的,当且仅当:

黑人先手必输,白人先手也必输

或者黑人先手必赢,白人先手也必赢

求石头数量最多的公平选择有多少个石头,注意这里是石头数量最多不是石头堆数最多

$n\leq40,a_i\leq40$,每堆候选石头用$0/1$串表示,从左到右表示从下到上的石头序列

一看就是找到$SG$函数的规律,然后折半搜索。

$SG$函数是什么呢QWQ

设:一个$0/1$串的价值$f(x)$,以$000101011$为例

1.将这个$0/1$串中的$0$变成$-1$ ->$-1·-1·-1·1·-1·1·-1·1·1$

2.找到第一个与首元素不同的元素,将它乘$2^{39}$,它的下一个元素乘$2^{38}$,下下一个乘$2^{37}$依此类推,而这个元素前面的所有元素都乘$2^{40}$,在这个数列中,首元素为$-1$,找到的第一个$1$是在第$4$位

$-2^{40}·-2^{40}·-2^{40}·2^{39}·-2^{38}·2^{37}·-2^{36}·2^{35}·2^{34}$

3.$f(x)$即为将这些数字加起来

$f(000101011)=-2^{40}-2^{40}-2^{40}+2^{39}-2^{38}+2^{37}-2^{36}+2^{35}+2^{34}$

一个局面的$SG$函数就是每堆石头的$f(x)$加起来

很奇怪吧?为什么是加不是异或?

先放结论:

对于黑方来说:若$SG$为正数,那么必赢,否则必输

对于白方来说:若$SG$为负数,那么必赢,否则必输

可知,公平选择的$SG$函数必然为$0$

证明:

我们使用数学归纳法,显然,考虑所有出度为$0$的局面,要么是空局面要么只剩一种颜色的石头,易知上述结论成立

这是个$DAG$游戏,因此按拓扑序归纳即可

由于黑白对偶,这里证明对于黑方的情况即可:

1.若现在$SG$不为正数,那么黑方必输,那么黑方一定无法将$SG$函数变为非负数(也就是白方必输的局面)

发现我们对一堆石头计算的$f(x)$是二进制价值,黑方要拿黑石头,一个黑石头上面的所有白石头产生的负贡献的和,一定不能抵消这块黑石头的正贡献,因此拿走这些石头相当于拿走了正的贡献,非正数减正数必为负数

2..若现在$SG$为正数,那么黑方必赢,那么必存在一种选择使得黑方可以将$SG$函数保持非负(也就是白方必输的局面)

这个证明比上面的难一些:

我们考虑所有的石头堆,我们找出每堆中从下到上第一个和底部石头颜色不同的石头,把这块石头下面的石头全部扔掉

剩下的每堆石头,我们看最高的那一堆石头,设这堆石头有$i$个石头

1.如果这堆石头顶部的石头是黑色,那么将这颗石头扔掉会损失$2^{40-i}$的贡献

2.如果这堆石头顶部的石头是白色,那么找到这颗石头下面第一颗黑色的石头,把它连着它上面的所有石头扔掉,也会损失$2^{40-i}$的概念

由于这堆石头是所有经过处理的石头堆中最高的,因此,所有的石头产生的贡献一定是$2^{40-i}$的倍数,因此当前$SG$为正且是$2^{40-i}$的倍数,用上面的策略扔石头,一定可以保证$SG$函数不会变成负数。

什么?你觉得为什么不能让从下到上乘$2^{40}、2^{39}······$

而非要让最下面颜色相同的一串均为$2^{40}$?

看起来用这种定义方法也可行,也能通过上面的证明的样子?

我一开始就是这么想的,然后愉快的WA4

hack:如果按照刚刚提到的这种方法,有一种情况是上面的证明没有考虑的:

最高的石头堆全是白色

这时这堆石头黑方是不能动的。。。。因此刚刚这种函数是不行的

然而,我们最开始提到的的函数就能避免这种情况,因为:

我们是将从下到上相同的一段石头扔掉后再比高度,因此,如果最高的石头全是白色,说明最高的石头高度为$0$,说明所有石头堆都是每堆只有一种颜色,否则就会出现高度$>0$的堆,当每堆只有一种颜色时,结论显然正确。

这题好有趣啊。

快乐的折半搜索即可,甚至合并的时候相加就行。

$O(n2^{n/2})$