集训Day 5 2020.3.4 杂题选讲(二)

集训Day 5 2020.3.4

杂题选讲

课后练习讲解

LGP1309 瑞士轮

\(2N\)名编号为\(1\)~\(2N\)的选手共进行\(R\)轮比赛。每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到底对选手进行一次排名。选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和。总分相同的,约定编号较小的选手排名靠前。
每轮比赛的对阵安排与该轮比赛开始前的排名有关:第1名和第2名、第 3名和第 4名、……、第\(2K−1\)名和第\(2K\)名、…… 、第\(2N-1\)名和第\(2N\)名,各进行一场比赛。每场比赛胜者得\(1\)分,负者得 \(0\)分。也就是说除了首轮以外,其它轮比赛的安排均不能事先确定,而是要取决于选手在之前比赛中的表现。
现给定每个选手的初始分数及其实力值,试计算在\(R\)轮比赛过后,排名第\(Q\)的选手编号是多少。我们假设选手的实力值两两不同,且每场比赛中实力值较高的总能获胜。
对于\(100\%\)的数据,\(1 ≤ N ≤ 100,000,1 ≤ R ≤ 50,1 ≤ Q ≤ 2N,0 ≤ s_1, s_2, …, s_{2N}≤10^8\)
\(1 ≤w_1,w_2,...,w_{2N}\le 10^8\)

题解

正常模拟\(\text O(rn\log n)\)肯定过不了
复杂度能降下来说明序列是有规律可循的
于是可以发现,胜者组和败者组它们的\(s\)永远都是单调递减的,然后就把两个有序的胜者组和败者合并就行了,和归并排序差不多

题目讲解

1.JSK43380

https://nanti.jisuanke.com/t/43380

\(n(n\leq 2500)\)个点两两之间的距离,现已知原图为一棵无向树,现在让你还原。
可能的图有很多种,输出一种就行。

题解

一种可能的图:对所有距离进行排序,不难发现两两之间的距离最小的两个点之间肯定有一条边,边权即为距离。
接下来的要么是两点之间有边,边权为距离,要么就是已经连好了,不需要你管, 而因为连好的边已经是尽可能的最小了, 所以一定满足条件。

2.JSK43513

https://nanti.jisuanke.com/t/43513

给一个只有二十个字母的字符串,长度\(\le 3\times 10^5\),要求取出其中的连续一段之后能够重排得到一个回文串,求这个回文串最长为多少?

题解

判断一个区间是否能组成回文串有两种条件:

  1. 长度为偶数,每种字符出现次数为偶数
  2. 长度为奇数,除一种字符以外每种字符出现次数为偶数

为第i种字符赋值为1<< i >>1,然后算出异或前缀和xor,可以发现一个符合要求的区间\([l,r]\)满足:
•1.xor[r]^xor[l-1]=0且区间长度为偶数
•2.xor[r]^xor[l-1]=1<< l >>1,\(1\le l\le 20\)且区间长度为奇数

1<< l >>1代表了我们给第l个字符赋值为\(2^{l-1}\),本质上就是在二进制上为第\(l\)位为1其他位为0的数,而那道题一共就20个字母故最多可能就20个1也就是大约\(10^6\)种状态,这个的理解上涉及了状压的知识,可能当时上课讲的不是很清楚
——by 子恒大佬

不难发现两种情况可以合并成为:
xor[r]^xor[l-1]=1<< l >>1,\(0\le l\le20\)
另外一个有趣的性质是xor的大小不会超过1<<20
那么做法就是存储每种xor值第一次出现的点,然后对于一个xor[r]来说,找到一个xor 值使得亦或后为1<< l >>1,复杂度为\(20n\)

3.LGP4942 小凯的数字

小凯写下了一串数字:\(l(l+1)(l+2)...r\),如\(l=8,r=12\)时,这个数字是89101112,他想问你这个数除以9的余数是多少。

题解

不难发现那个大数可以写作\(l\times 10^a+(l+1)\times 10^b+...\)
对它mod 9相当于对\(l+(l+1)+(l+2)+...+r\) mod 9(因为\(10^n\mod 9=1\)
再进行等差数列求和

4.P3799 拼木棒

\(n\)根木棒,现在从中选4根,想要组成一个正三角形,问有几种选法?
\(N\le 100000,\text{length}\le5000\)

题解

先从长度是\(k\)的里面拿出两个,就是\(C(n_k,2)\),然后从剩下的里面取出两个让长度是\(k\),如果取两个\(\dfrac{k}{2}\)的,就是\(C(n_{\frac{k}{2}},2)\)(仅当\(k\)是偶数),要不然就是长度为\(j\)取一个,\(i\)取一个,使得\(i+j=k\),这是就是\(C(n_j,1)\times C(n_i,1)\)
以上的\(n_p\)表示长度为\(p\)的木棍个数

显然我们要找两个相同长度的木棒,然后 再找两根长度加起来等于上面长度的木棒。
发现长度很小,于是暴力枚举两根木棒的长度,然后组合数计算一下即可。
——by子恒大佬

5.LGP3197[HNOI2008] 越狱

监狱有连续编号为 \(1…N\)\(N\)个房间,每个房间关押一个犯人,有 \(M\)种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。

题解

不妨考虑有多少种状态不会越狱。\(M(M-1)(M-1)……\)
然后减一下,\(\text{ans}=m^n-m(m-1)^{n-1}\)

6.P6033 合并果子加强版

\(n\)堆果子,每次合并两堆,代价为两堆果子数量之和。问最小代价把所有果子合并为一堆
\(1\le n \le 10^7,1\le a_i\le 10^5\)

题解

一个显然的贪心:每次合并最小的两堆。
证明并不显然,要用到哈夫曼树的结论

由于\(a\)很小我们可以进行\(O(n)\)的排序,可问题是\(n\le 10^7\),怎么做才能每次都拿出两个最小的果子?
不难发现,我们每次合并出来的果子的大小是递增的。
于是原果子堆一个队列,新果子堆一个队列,就可以保证队列的单调性。

哈弗曼树
给定\(N\)个权值作为\(N\)个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
——百度百科
http://c.biancheng.net/view/3398.html
https://blog.csdn.net/tomjobs/article/details/104538404

课后练习

1.P2827 蚯蚓

题中,我们将用符号 \(\lfloor c \rfloor\) 表示对\(c\)向下取整,例如:\(\lfloor 3.0 \rfloor = \lfloor 3.1 \rfloor = \lfloor 3.9 \rfloor = 3\)
蛐蛐国里现在共有 \(n\)只蚯蚓(\(n\)为正整数)。每只蚯蚓拥有长度,我们设第 \(i\) 只蚯蚓的长度为 \(a_i (i=1,2,\dots,n)\),并保证所有的长度都是非负整数(即:可能存在长度为\(0\)的蚯蚓)。
每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个)将其切成两半。神刀手切开蚯蚓的位置由常数\(p\)(是满足 \(0 < p < 1\) 的有理数)决定,设这只蚯蚓长度为\(x\),神刀手会将其切成两只长度分别为 \(\lfloor px \rfloor\)\(x - \lfloor px \rfloor\) 的蚯蚓。特殊地,如果这两个数的其中一个等于0,则这个长度0的蚯蚓也会被保留。此外,除了刚刚产生的两只新蚯蚓,其余蚯蚓的长度都会增加\(q\)(是一个非负整常数)。
蛐蛐国王知道这样不是长久之计,因为蚯蚓不仅会越来越多,还会越来越长。蛐蛐国王决定求助于一位有着洪荒之力的神秘人物,但是救兵还需要\(m\)秒才能到来……(\(m\) 为非负整数)
蛐蛐国王希望知道这\(m\)秒内的战况。具体来说,他希望知道:
\(m\)秒内,每一秒被切断的蚯蚓被切断前的长度(有\(m\)个数);
\(m\)秒后,所有蚯蚓的长度(有\(n + m\)个数)。

题解

先说一句,优先队列会被卡常TLE

单调性.
发现先被切掉的蚯蚓分成的蚯蚓一定比后切掉的蚯蚓分成的蚯蚓大.   
假设这两只蚯蚓分别为\(a,b\),其中\(a>b\).那么它被切成\(a_1,a_2\)\(t\)秒后, \(b\)被切成了\(b_1,b_2\),此时\(a_1,a_2\)的长度为\(l_{a_1}+t=pl_{a}+t,l_{a_2}+t=(1-p)l_a+t\),而\(b_1,b_2\)的长度却为\(p(l_b+t),(1-p)(1_b+t)\),容易看出\(l_{a_1}>l_{b_1},l_{a_2}>l_{b_2}\)。也就是说根本不需要用一个堆来维护, 它本来就具有一定单调性.
那么就是说如果蚯蚓\(a_1,a_2,\cdots,\)满足\(a_1>a_2>\cdots\),那么以此分成两只\(a_{11},a_{12},a_{21},a_{22},\cdots\)。那么\(a_{12}>a_{22}>\cdots,a_{11}>a_{21}>\cdots\),那么就可以将这两堆依次存储,加上还没被切过的蚯蚓.每次要切时在这三堆里面选择最大的, 切完再依次放回去. 所以这么做时间复杂度为\(O(m)\).再优化一下细节基本上就没问题了.

2.JSK43514

https://nanti.jisuanke.com/t/43514

游戏在矩形的\(M×N\)网格上进行,该网格由不同类型的正方形图块组成。
动物和食物的规则
网格上有一些动物,每只动物正好占据一块瓷砖。
草长大,绵羊吃草,狼吃绵羊,狼和绵羊都会因为饥饿而死。
转弯和动物动作
每回合由以下顺序的动作组成:
1.网格上的所有动物都移动。每只狼都移动到东部(右侧)附近的一块瓷砖中。如果狼无法移动,则狼将移动到其行中最西端的瓷砖。每只绵羊都向南移动(下)的相邻砖块。如果无法移动绵羊,则绵羊将移动到其列中最北端的图块。
2.如果狼和绵羊占据同一块瓷砖,则狼吃掉绵羊,并将该瓷砖更改为\(\text{carcass}\)的土壤瓷砖。
3.如果将绵羊放在带有草砖的土壤上,则绵羊会吃草,并且将其换成土壤砖。
4.如果狼在包括当前回合在内的最后10个回合中都没有吃东西,它将死去,并将其换成\(\text{carcass}\)土壤砖。
5.如果绵羊在最后5个回合(包括当前回合)中的任何一个中都没有进食,则它会死去,然后将其换成\(\text{carcass}\)土壤砖。
瓷砖的类型及其变化
共有三种类型的图块。瓦片的类型可以在游戏过程中改变。
1.土砖:游戏开始后3圈后或变成土砖后3圈后,砖变成了带有草砖的土。
2.带有草砖的土壤:如果草被羊吃掉,则草砖立即变成土壤。3圈后,草将再次在瓷砖上生长。
3.\(\text{carcass}\)土壤:每当动物死于任何类型的砖时,该砖立即成为带有car体砖的土壤。动物仍然可以移动到该图块,但是草不会再在该图块上生长。随着游戏的进行,瓷砖上可能会堆积更多的尸体。
给定特定字母表示的一张图,求\(T\)回合后图的情况。

题解

一道大模拟

3.一道补充的期望+逆元

你在玩抛硬币,正面向上的概率为\(p\),求第一次出现连续 \(k\)次正面向上的期望步数。
输出一个整数表示期望步数对 998244353 取模的结果。
可以证明,答案一定为有理数。设其为\(\dfrac{a}{b}\)\(a\)\(b\)为互质的正整数,数据保证\(b\)不为998244353 的倍数),则你需要保证输出的数\(x\)满足 \(0 ≤ x < 998244353\)\(a ≡ bx (\mod 998244353)\)。可以证明这样的 \(x\) 唯一存在。
\(k\in [0,10^{18}],p\in (0,998244353)\)

题解

\(f_k\)表示第一次出现连续\(k\)次正面向上的期望步数。
考虑当前已经连续\(k-1\)次正面向上,抛出下一步之后,有\(p\)的概率出现连续\(k\)次正面向上,\(1-p\)的概率功亏一篑,相当于重新开始。
故很容易列出转移方程

\[f_k=f_{k-1}+1+(1-p)f_{k} \]

整理得\(f_k=\dfrac{f_{k-1}}{p}+\dfrac{1}{p}\),可以整理成等比数列的形式,

\[f_k=\sum_{i=1}^kp^i \]

复杂度\(O(\log_2n)\)

posted @ 2020-03-05 12:24  刘子闻  阅读(460)  评论(0编辑  收藏  举报