中文题题意不再赘述。
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=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.