A.Chess For Three
题意就是三个人不停地下棋,输了的那个人下去观战,观战的人上来和赢家继续下,按照时间顺序给定一系列的赢家和输家,问是否合法。
可以发现某一局的赢家只可能是上一局的观战者或者上一局的赢家,某一局的输家也只可能是上一局的观战者或者上一局的赢家,由于规定了第一局对战的两个人,因此每一局都可以由上一局的记录的到,那就用三个变量模拟记录一下每一局的三种人,看是否出现矛盾即可。
代码:
1 |
|
B.Beautiful Divisors
题意就是给你一个数找出这个数最大的美丽因数,由于美丽因数仅由低位的连续$k$个$0$加上高位的连续$k+1$个$1$组成,那么直接预处理出这些美丽因数,最多也就几十个吧,每次输入逆序找到第一个能被整除的因数就是答案了,当然答案是一定存在的因为$1$总是任意一个正整数的因数
代码:
1 |
|
C.Rumor
题意就是让你去传播言论,使得最终所有人都知道这个言论,每一个人要花一定价格才能让他去传播,但是一个人被传播之后会无偿地向它认识的人传播,因此可能只需要找到其中几个人传播就可以达到最终目的了,求最后的花费最小。很容易想到对这个朋友关系图求强连通分量,把每个$SCC$中花费最小的拿出来加到答案上即可,但是这个样子码量大。所以既然是无向图干嘛不考虑用并查集呢,把认识的人合并起来,最终一个集合就是代表了一个$SCC$,拿每一个点的花费去更新他所在集合的最小花费,最后把所有集合的最小花费加起来就是答案了。
代码:
1 |
|
D.Credit Card
题意就是你有一张银行卡,有$N$天的晚间操作记录,如果操作记录大于$0$代表你向里面存款,小于$0$就是取款,等于$0$就是检查余额,要求是每当检查余额时存款不能为负数否则就输出$-1$,如果某一时刻存的钱大于$d$,也将输出$-1$,另外你在任意一天的早上可以直接去银行存任意多的钱,求尽量不出现$-1$时最少去银行存款的次数。显然任意一天的早上去存款实际上还不如在检查余额那天的早上去存款,然后考虑存款的影响, 假如我在第$x$天早上存款了$k$元,那么$[x,n]$天都会受到影响,即剩下那些天的余额一定会增加$k$,那么我只要在检查余额时如果发现余额为负数,那么一定要存款,贪心地存入对剩下的日子均没有影响的最大钱数,然后看这样存进去之后是不是还是负数,如果这天还是负数,说明只能输出$-1$,否则继续遍历更新,所以这里需要用线段树更新和查询区间的最大值。
代码:
1 |
|
E.Counting Arrays
把一个数$x$恰好分解成$y$个数的乘积,问这样的$y$个数组成的序列有几种。由于是乘积的问题,我们可以先把$x$因数分解(准确的说应该叫质数分解),假设第$i$个因数为$a_i$,它在$x$中所占的指数为$b_i$,那么所要做的就是把这个$b_i$个$a_i$分到$y$个位置中去,问题就变成了将$b_i$个相同物品装入$y$的箱子,且允许出现空箱,那么这个因数$a_i$贡献的答案就是$C_{b_i+y-1}^{y-1}$(由于答案与补集的方案数等价,可以优化成$C_{b_i+y-1}^{b_i+y-1-(y-1)}=C_{b_i+y-1}^{b_i}$),那么把每一个因数按此方法求出来的方案数相乘就是$y$项全为正数的答案,但是题目说还可以用负数,那就是从$y$项中选出偶数项,在其前面添加负号,那这样的贡献就是$C_{y}^{0}+C_{y}^{2}+C_{y}^{4}+C_{y}^{6}$,即二项式展开的偶数项求和,用定理可以直接得到答案为$2^{y-1}$,最后再乘上这个数即可。注意过程中要即时取模,或者用快速乘法,否则很容易爆$long\ long$
树套树代码:
1 |
|
F.Subtree Minimum Query
题意就是给你一棵树,树边长度均为$1$,每个点均有权值,询问你某一个节点的子树中到这个节点的距离不超过$k$的这些节点集合中,最小权值是多少。询问强制在线
思路有一点,完全不知道代码如何实现,一开始用$BFS$、$DFS$序,(然后发现这样显然是错的),真的不会了……搜了波题解,发现原来是线段树套线段树(以前想学苦于智商太低想象力又不够好看不懂XD),然后就是照着人家的代码临摹一发,粗略地地理解一下,一维显然是按照$DFS$序开一个静态线段树,记这个静态线段树的下标为$p$p,以$root[p]$为根,按照节点的深度建立动态开点的线段树,最后询问就是查询一维在$[L[u], R[u]]$,二维在$[dep[u], dep[u] + k]$范围内的最小值。
早上起来突然发现如果我们用$DFS$序当第一维的关键字,到根节点的距离当第二维的关键字,当这玩意儿不就是个$KD-tree$的静态建树+二维矩阵最小值查询的模板题吗,而且空间复杂度才$O(n)$,赶紧码了一发,结果时间居然跟树套树几乎一样……只能说666了
树套树代码:
1 |
|
$KDtree$代码
1 |
|