题意:给出一个数$M$,求出一个字典序最小的区间$[a,b]$,满足$\text{lcm}(a,a+1,\dots,b)=M$。
题解:显然,我们可以知道区间长度不能超过$50$,否则$lcm$会超过$10^{18}$。然后$lcm(x, x+1)=x(x+1)$,可以特判掉区间长度为$2$的情况。然后$lcm(x, x+1,x+2)=x(x+1)(x+2) \text{ or } \frac{x(x+1)(x+2)}{2}$,可以处理掉区间长度为$3$的情况。然后$lcm(x,x+1,x+2,x+3)=x(x+1)(x+2)(x+3) \text{ or } \frac{x(x+1)(x+2)(x+3)}{2} \text{ or } \frac{x(x+1)(x+2)(x+3)}{3} \text{ or } \frac{x(x+1)(x+2)(x+3)}{6}$,区间长度为$4$也能处理了。那么剩下来的$b$必定不超过$O(\sqrt[5]{M})$,直接暴力枚举$a$和$b$,判断$lcm$是否为$M$即可。
题意:给出一个字符串$s$,保证来自Pan Tadeusz
或者Quo Vadis
或者Lalka
。判断这个字符串来自那本书。正确率$90%$就算对。
题解:什么玩意???
题意:给出两个长度为$n$的数字串$A$和$B$,保证$A \ge B$。你可以修改$A$里面恰好$k$个位置,找出一个最大的小于$B$的数。
题解:首先肯定存在一个$p$,使得$C_1=B_1,C_2=B_2,\dots,C_{p-1}=B_{p-1},C_{p-1} \le B_{p-1}$,并且这个$p$要越大越好。
于是我们不妨枚举这个$p$,看看什么时候$p$是合法的。令$S_i=\sum_{t=1}^{i} [A_t \ne B_t]$,显然要有$S_{p-1} \le k$。接下来考虑$A_p$需不需要修改:
-
$A_p \ge B_p$ ,肯定得修改,那么得要$S_{p-1}+1+n-p \ge k$; -
$A_p + 1 \ne B_p$ ,可以把$A_p$修改成$B_p-1$,那么得要$S_{p-1}+1+n-p \ge k$; -
$A_p+1=B_p$ ,并且$A_p \ne 0$以及$S_{p-1}+n-p=k-1$,必须把$A_p$修改成$A_p-1$。 -
其他情况肯定是$A_p$不修改比较优。
找到合法的$p$之后,就可以把$C_1,C_2,\dots,C_p$都求出来,之后考虑求后面部分,假设当前还需要修改$m$个位置:
-
$A_i=9$ ,如果$m \le n-i$,显然不修改比较好;否则改成$8$最优; -
$A_i \ne 9$ ,肯定直接修改是最好的。
题意:给出$n$个点$m$条边的无向图,有$k$种颜色,求出图的染色方案数。
-
$1 \le n, k \le 8$ -
$1 \le n \le 15, 1 \le k \le 10^9$ -
$0 \le m \le 24, 1 \le k \le 10^9, 1 \le n \le 10^5$ -
$1 \le n \le 10^5, 0 \le m \le 10^5, 1 \le k \le 10^9$ ,每个点度数为$2$。
题解:前两组可以用FWT做到$O(n^3 \cdot 2^n)$,第三组可以用容斥原理做到$O(2^m)$,第四组可以直接计算。
题意:给出一个$n \times m$的格子,求出一个生成树,使得直径长度恰好为$k$。
题解:我们很容易构造一个$k=nm-1$的解,因此$k$的上界是$nm-1$。考虑$k$的下界:
-
$n$ 和$m$都是偶数,可以发现不管怎么构造,$k$最小只能是$n+m-1$。 -
$n$ 和$m$其中一个是奇数,可以发现,$k$最小可以是$n+m-2$。
先考虑$n$和$m$其中一个是奇数,假设$n$是奇数。
那么$k=n+m-2$的话,可以$(1,1) \to (\frac{n+1}{2}, 1) \to (\frac{n+1}{2}, m) \to (n, m)$得到,其他点都竖直和$(\frac{n+1}{2}, 1) \to (\frac{n+1}{2}, m)$这条线相连即可。
考虑$k$增加了$1$,在上面基础上可以擦掉$(1,2)$和别人的边,连上$(1,1)$。
如果$k$又变大了$1$,在上面基础上可以擦掉$(1,3)$和别人的边,连上$(1,2)$。
依次类推,走蛇形即可。如果上半部分用完了,从$(n,m)$开始向左走折线即可。
题意:给出一棵$n$个点的树,第$i$个点有个权值$w_i$。现在要一些点$p_1,p_2,\dots,p_m$,使得相邻两个点距离恰好是$2$,并且权值和最大。
题解:令$sw(u)$是和$u$相邻点的权值和,$f(u)$和$g(u)$表示考虑以$u$为根的子树,其中$u$被选了和没被选用的最长链。那么$g(u)=\max_{v \in Son(u)} f(v)+sw(u)-w(v)$,$f(u)=\max_{v \in Son(u)} g(v)$。
然后在每个点$u$,考虑$u$选还是不选来更新答案。分别是$\max_{x,y \in Son(u)} f(x)+f(y)-w(x)-w(y)+sw(u)$和$\max_{x,y \in Son(u)} g(x)+g(y)-w(u)$。
输出方案的话记录$f(\cdot)$和$g(\cdot)$来自哪个点即可。
题意:有一个$2^m \times 2^m$的黑白格子,现在用quadtree
来定义这个格子。
- 如果整个格子都是白色的,用一个
0
来标记 - 如果整个格子都是黑色的,用一个
1
来标记 - 否则,这棵树的根用
4
来标记,接下来对应$4$个$2^{m-1} \times 2^{m-1}$的格子描述,以左上角,右上角,左下角,右下角的顺序描述。
现在给出$m$和一个长度为$n$的字符串,用于描述这个格子。求出这个格子里面连通块的个数和面积最大的连通块。面积对$10^9 + 7$取模。
题解:可以把这个格子看成一个平面图,那么显然最多只有$n$个面,于是可以先遍历依次字符串求出每个面大小和出现位置。之后遍历每个面的$4$个边界,判断和这个边界相邻的面是否都是黑色,是的话连一条边。这样就可以得到一个黑色格子的图,可以求出所有连通分量。对于每个连通分量维护一个std::map
,记录大小为$2^x \times 2^x$的面出现次数,记得处理下进位。比较大小也可以用这个std::map
轻松做到。
题意:有$n$个多米诺骨牌,第$i$个立在了位置$x_i$处,高度为$h_i$。现在又有$N_1$个高度为$H_1$和$N_2$个高度为$H_2$个多米诺骨牌。保证要么$H_1$是$H_2$的约数,要么$H_2$是$H_1$的约数,且$H_1$和$H_2$都小于之前的多米诺骨牌高度。。
你可以任意放置这些骨牌,然后最后选个位置往左或者往右推。求出最多能够推倒多少骨牌。
题解:首先肯定是推一个早已经放下的骨牌是最优的。假设我们要往左推,那么不妨先把全部都往左推倒。然后这些倒下的骨牌会覆盖$O(n)$个区间,我们的目的就是为了用新来的骨牌填上这些区间之间的空隙。
枚举一个区间,要从这个区间开始一直往左把空隙都填上。假设我们要填的空隙长度为$L_1.L_2,\dots,L_m$。假设$H_1 < H_2$,那么$\frac{L_i}{H_2}$部分肯定尽量用$H_2$比较好,$H_2$不够的话,用$\frac{H_2}{H_1}$个$H_1$拼起来即可。那么剩下还有$L_i \bmod H_2$部分要填,如果$H_2$还有剩,把最大的几个填了。那么接下来只能用$H_1$填了,需要$\lceil \frac{L_i \bmod H_2}{H_1} \rceil$。
显然这个可以双指针来做,用线段树的维护$L_i \bmod H_2$的顺序即可。
题意:给出一个正整数$n$,求出两个不超过$n$的正整数$x$和$y$,使得集合${d: d \mid x \text{ or } d \mid y }$的大小最大。
题解:可以猜想$x$和$y$的约数个数肯定很多,但不一定是最多的。约数个数最多的数一定满足它的质因数分解$2^{e_2} 3^{e_3} 5^{e_5} \dots$中$e_2 \ge e_3 \ge e_5 \ge \dots$。那么我们可以先按照这个枚举数哪些约数个数可以出现,不妨取最大的$10$个,记为$S$。然后我们枚举出差不多所有约数个数在集合$S$里的数。
这样的数也有很多,我们还是按照$2^{e_2} 3^{e_3} 5^{e_5} \dots$顺序枚举,不过这次需要保证$e_{p_{i+1}} \le e_{p_i} + 1$,并且$e_{p_{i+1}} \le e_{p_i} + 1$的$i$不超过$2$个。符合这样条件的数也不多,仅有$200$多个。之后暴力枚举$x$和$y$检查即可。
题意:给出长度为$n$的01
串。有$m$个操作,每次翻转位置$a_i$的字符。每次操作后,找出最短的不作为子串出现的01
串。
题解:长度最长$O(\log n)$,用$cnt(x,y)$表示长度为$x$的串里$y$出现了几次,同时维护$tot(x)$表示长度为$x$串出现了几种。
在修改的时候很容易用$O(\log^2 n)$来维护。查答案的话,就找个最小的$x$,使得$2^x \ne tot(x)$。