Skip to content

Latest commit

 

History

History
163 lines (86 loc) · 9.34 KB

File metadata and controls

163 lines (86 loc) · 9.34 KB

POI 2019/2020 XXVII

Stage I

Najmniejsza wspólna wielokrotność (nww)

题意:给出一个数$M$,求出一个字典序最小的区间$[a,b]$,满足$\text{lcm}(a,a+1,\dots,b)=M$。

$1 \le M \le 10^{18}$

题解:显然,我们可以知道区间长度不能超过$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$即可。

Pisarze (pis)

题意:给出一个字符串$s$,保证来自Pan Tadeusz或者Quo Vadis或者Lalka。判断这个字符串来自那本书。正确率$90%$就算对。

$10 \le |s| \le 2000$

题解:什么玩意???

Pomniejszenie (pom)

题意:给出两个长度为$n$的数字串$A$和$B$,保证$A \ge B$。你可以修改$A$里面恰好$k$个位置,找出一个最大的小于$B$的数。

$1 \le k \le n \le 10^5$

题解:首先肯定存在一个$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$,肯定直接修改是最好的。

Przedszkole (prz)

题意:给出$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)$,第四组可以直接计算。

Układ scalony (ukl)

题意:给出一个$n \times m$的格子,求出一个生成树,使得直径长度恰好为$k$。

$1 \le n, m \le 1000, 0 \le k \le 10^6$

题解:我们很容易构造一个$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$和$m$都是偶数的话也可以通过类似的构造搞。

Stage II

Day 0

Wakacje Bajtazara (wak)

题意:给出一棵$n$个点的树,第$i$个点有个权值$w_i$。现在要一些点$p_1,p_2,\dots,p_m$,使得相邻两个点距离恰好是$2$,并且权值和最大。

$1 \le n \le 10^6, 1 \le w_i \le 10^6$

题解:令$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)$来自哪个点即可。

Day 1

Drzewo czwórkowe (czw)

题意:有一个$2^m \times 2^m$的黑白格子,现在用quadtree来定义这个格子。

  • 如果整个格子都是白色的,用一个0来标记
  • 如果整个格子都是黑色的,用一个1来标记
  • 否则,这棵树的根用4来标记,接下来对应$4$个$2^{m-1} \times 2^{m-1}$的格子描述,以左上角,右上角,左下角,右下角的顺序描述。

现在给出$m$和一个长度为$n$的字符串,用于描述这个格子。求出这个格子里面连通块的个数和面积最大的连通块。面积对$10^9 + 7$取模。

$1 \le m \le 10^9, 1 \le n \le 10^6$

题解:可以把这个格子看成一个平面图,那么显然最多只有$n$个面,于是可以先遍历依次字符串求出每个面大小和出现位置。之后遍历每个面的$4$个边界,判断和这个边界相邻的面是否都是黑色,是的话连一条边。这样就可以得到一个黑色格子的图,可以求出所有连通分量。对于每个连通分量维护一个std::map,记录大小为$2^x \times 2^x$的面出现次数,记得处理下进位。比较大小也可以用这个std::map轻松做到。

Wielki Upadek (wie)

题意:有$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$都小于之前的多米诺骨牌高度。。

你可以任意放置这些骨牌,然后最后选个位置往左或者往右推。求出最多能够推倒多少骨牌。

$1 \le n \le 200000, 0 \le x_i \le 10^{18}, x_{i-1} < x_i, 1 \le h_i \le 2000000, 0 \le N_1, N_2 \le 10^{18}, 1 \le H_1, H_2 \le 10^6$

题解:首先肯定是推一个早已经放下的骨牌是最优的。假设我们要往左推,那么不妨先把全部都往左推倒。然后这些倒下的骨牌会覆盖$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$的顺序即可。

Day 2

Trudny dylemat przedszkolanina (tru)

题意:给出一个正整数$n$,求出两个不超过$n$的正整数$x$和$y$,使得集合${d: d \mid x \text{ or } d \mid y }$的大小最大。

$1 \le n \le 10^{16}$

题解:可以猜想$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$检查即可。

Marudny Bajtazar (mar)

题意:给出长度为$n$的01串。有$m$个操作,每次翻转位置$a_i$的字符。每次操作后,找出最短的不作为子串出现的01串。

$1 \le n \le 10^5, 0 \le m \le 10^4$

题解:长度最长$O(\log n)$,用$cnt(x,y)$表示长度为$x$的串里$y$出现了几次,同时维护$tot(x)$表示长度为$x$串出现了几种。

在修改的时候很容易用$O(\log^2 n)$来维护。查答案的话,就找个最小的$x$,使得$2^x \ne tot(x)$。