牛客小白月赛6 题解

中文题题意不再赘述。

A:要是模拟的话就会比较复杂,这里只需要判断答案可能不为(l/b)-(l/a)的情况即可(实际上数据都是这个答案)唯一一种情况就是a>b并且两人距离为k时b就可以游回去。但是在b到达终点之前不能与环另一边的a距离小于k,需要再判断一下。(好像实际上不存在这种情况?还是数据太水了?),也有大神用二分也可以做。

B:签到题。模拟一下上升、平飞再下降的过程即可。

C:求树的直径(树上最长路),这是一个很经典的问题,直接百度就有很多资料。

D:直接预处理出每个位置的字母在他之前出现了多少次,然后O(1)回答即可。

E:最简单的做法就是每下一个棋子,判断 左+右,上+下,左上+右下,左下+右上 的同色棋子数是否超过5个即可。找某一个方向的棋子时,超过4个连续的一样的颜色就可以停止了。注意:题干有问题,HtBest应该是奇数步,而WHZ是偶数步。

F:树状数组单点更新区间查询,维护乘积。由于用到除法,还需要使用逆元。不懂可以自行百度。

G:这个题其实并不难。。。但是比赛的时候没看。只需要用set维护一下加入的指纹即可,每次lower_bound(x-k)看是否存在即可。至于删除就是指针扫一遍直到end或者>x+k。

H:求最小生成树。有kruskal算法和prim算法。个人比较喜欢前者(用并查集维护连通信息,然后边排序每次取最小的)

J:就是推公式啊。也是要用快速幂和逆元。不懂大佬的做法。我的做法就是推出来 答案为

k+k^2+...+k^{n-1}+p*(k*(n-2)+k^2*(n-3)+...+k^{n-2})+(n-1)*p+1

然后前面是一个等比数列,用求和公式求即可。后边的直接求。

中间的部分其实就是p*((n-1)*(k+k^2+...+k^{n-2})-(k+2*k^2+..+(n-2)*k^{n-2}))

后者公式为(k-(n+1)*k^{n+1}+n*k^{n+2})/(1-k)^2   。(求法在下面)

然后k=1的情况特判一下就好了。

求:k+2*k^2+3*k^3+……+n*k^n
令S=k+2k^2+3k^3+……+nk^n………………………………(1)
①当k=0时,S=0;
②当k=1时,S=1+2+3+……+n=n(n+1)/2;
③当k≠0,且k≠1时:(1)式两边同乘以k得到:
k*S==…k^2+2k^3+……+(n-1)k^n+nk^(n+1)………………(2)
(1)-(2)得到:
(1-k)S=k+k^2+k^3+……+k^n-nk^(n+1)
===> (1-k)S=[k*(1-k^n)/(1-k)]-nk^(n+1)
===> (1-k)S=[k-(n+1)k^(n+1)+nk^(n+2)]/(1-k)
===> S=[k-(n+1)k^(n+1)+nk^(n+2)]/(1-k)^2.

猜你喜欢

转载自blog.csdn.net/LSD20164388/article/details/81835269