模拟65 题解

A. Simple

首先求出n,m的gcd,那么显然只有gcd的倍数可能被拼出,其他数一定是不好的数。

所以问题转化为用$\frac{n}{gcd}$,$\frac{m}{gcd}$,拼不出的$\frac{q}{gcd}$范围内的数。

因为除gcd后的n,m互质,

用某凯的疑惑中的结论可知最大的拼不出的数是$n*m-n-m$。

所以给$n*m-n-m$不断减掉n或m,一定仍然为拼不出的数。

然后就可以发现,题目中给出n的范围恰好不大。

所以给上述的数不断减m,并除n求出有多少个数就可以了。

 

 

 

B. Walk

打了一个非常奇怪的点分治,大概是利用了对一条边取gcd之后的不同值不会有太多。

开了很多个$vector$,并暴力扫$vector$更新答案,随机极限数据跑不到1s,得到了70分。

正解利用了边权的因数个数不超过根号级别。

所以枚举答案的大小,并只将边权有该因数的边建出来。

于是问题转化为了求建边形成的森林中最大的树的直径,直接dfs就可以了。

 

 

 

C. Travel

将问题中的相邻点作为一条线段。

首先考虑起点为1,终点为n的答案。

那么每条线段都会覆盖至少一次,

因为要向左跳,至少L条线段上的路径是-->,<--,-->,会覆盖至少三次。

并且存在一种方案构造出L条线段覆盖三次。

取得最小的L条线段,就可以累计答案。

 

当起点和终点并不为端点,不妨设$1<s<t<n$。

那么起点左侧的线段至少被覆盖两次,终点右侧的线段至少被覆盖两次。

显然对于s,t中间的答案贡献,向左跳次数越小越优,所以让两侧的线段尽可能向左跳。

使右端点单调,就可以用小根堆维护。

 

posted @ 2019-10-09 12:16  skyh  阅读(156)  评论(0编辑  收藏  举报