GZOI/GXOI2019

陆陆续续做完了……

与或和(单调栈)

这是一道一眼题……

看到位运算,按位考虑贡献。对于每一位,将矩阵中的元素变为“当前元素的这一位是否为(1)”,那么原矩阵变为(01)矩阵。在(01)矩阵中能够对(AND)产生贡献的是全(1)的矩阵,能够对(OR)产生贡献的是存在(1)的矩阵,那么我们需要求全(1)和全(0)矩阵,单调栈做一下就可以了。

代码

宝牌一大堆(DP)

这是一道暴力题……

国士无双可以直接判,七对子用贪心判一下,对于(3 imes 4 + 2)的结构,对于每一种花色DP:设(f_{i,j,k,l,m,n})表示考虑第(i)种花色的第(j)种牌,选了(k)个面子和杠子、(l)个对子、(m)((j-1,j,j+1))的顺子、(n)((j,j+1,j+2))的顺子的最大达成分数。转移枚举(j+1)的数量、((j+1,j+2,j+3))的数量,剩下的做对子/刻子/杠子。对于字牌也这样DP一下,只是不需要考虑顺子。

最后合并的时候枚举一下每一种花色选了多少对子、面子和杠子然后合并就可以了。

代码

特技飞行(贪心、扫描线)

这是一道强行二合一……

首先我们求能够被嘉宾看到的特技数量。因为特技的位置和嘉宾的视野范围是固定的,所以最开始用一个set维护出所有的特技的位置,然后曼哈顿距离转切比雪夫距离之后就是要求每一个点是否被任意一个正方形覆盖,离散化+扫描线即可。这一段相对细节较多。

然后我们要求最大和最小的特技分数。注意到特技分数和选择某一种特技的次数呈正相关,那么我们只需要求出“对向交换”次数最多和最少的方案数,就可以得到分数最小和最大的方案数。“对向交换”次数最多的显然是所有交点都使用“对向交换”。

“对向交换”最少的情况考虑:对于每一个飞机,如果它在(x_{st})处的纵坐标排名为(i),在不使用“对向交换”到达(x_{ed})时的纵坐标排名为(j),那么连边((i,j))。我们可以得到一个(N)个点、(N)条边、由若干个环构成的有向图,而我们最终的目标是让这个图变为(N)个自环。而每一次“对向交换”可以交换两个点最终的纵坐标排名,也就是交换两条边的出边,所以对于一个长度为(len)的环需要(len - 1)次交换,所以最小总次数=$sum len - 1 = N - $环的个数。

代码

逼死强迫症(矩阵快速幂)

这是一道模板题……

(f_{i,0/1/2})表示填满了前(i)列、放了(0/1/2)(1 imes 1)的方块的方案数。转移只需要考虑放(1)的方案,其他和斐波那契数列没有不同。注意两个(1 imes 1)的方块不能放在一起。

矩阵大小大概是(5 imes 5)

代码

旅行者(最短路)

这是一道简单题……

一种比较直接的思路是:正着、反着跑两遍从关键点到其他所有点的最短路和次短路长度,然后对于每一条边(x ightarrow y)考虑贡献答案,如果从关键点到(x)的最短路对应的点和从(y)到关键点的最短路对应的点是同一个就用一条最短路和一条次短路更新。

但是实际上如果某一条路径是答案,那么在这条路上一定会存在一条边(x ightarrow y),使得从关键点到(x)的最短路对应的点和从(y)到关键点的最短路对应的点是不同的。所以可以直接记录最短路从哪里来,也是正确的。

代码

旧词(差分、树链剖分)

这是一道大家都应该见过的数据结构题……

没有思路的建议先去做LNOI2014 LCA

然后可以发现这就是上面那道题的(k)次方版本。那么对于点(x),记录它的权值为(dep_x^k - (dep_x - 1)^k),那么点(x)对点(y)的贡献就是(LCA(x,y))及其祖先节点的权值之和。仍然用树链剖分+线段树维护链上权值和即可。

代码

原文地址:https://www.cnblogs.com/Itst/p/10806710.html