zoukankan      html  css  js  c++  java
  • 模拟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中间的答案贡献,向左跳次数越小越优,所以让两侧的线段尽可能向左跳。

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

  • 相关阅读:
    c copy
    IfcVertexLoop
    qt windeployqt 日志
    IfcPolyLoop
    IfcEdgeLoop
    IfcLoop
    QTableWidget
    QList删除元素
    matlab X的负次方函数绘制2
    matlab X的负次方函数绘制1
  • 原文地址:https://www.cnblogs.com/skyh/p/11640988.html
Copyright © 2011-2022 走看看