NOIP模拟 23

  曾经有一段真挚的AK摆在skyh面前,但他一直意淫自己AK导致没有AK。

  如果非要把这AK加一个期限的话,skyh一辈子都AK不了了。

  

  论爆零选手的爆零原因

  我说T3想到了能AC的思路但是爆零了有人同情吗?  

    for(int j=1;j<=p&&i*prime[j]<maxm;++j){
        isnot[i*prime[j]]=1;
        if(i*prime[j]==0){//qaq
            mu[i*prime[j]]=0;
            break;
        }
        else mu[i*prime[j]]=-mu[i];
    } 
欧拉筛打爆

    //上边是绞尽脑汁写的dp
    long long ans=dp[n][0][0]+dp[n][1][1]+dp[n][3][0]+dp[n][3][1];//没取模,功亏一篑
    printf("%lld
",ans%mod);
    return 0;
就是没状态

  只有T2没辜负我的期望QMQ拿稳了大众及格分

  T2正解是个神奇floodfill算法(?)

  首先yy一下 从一个点到矩形外所有路径上最大值的最小值

  假如从这个点放水直到它流到矩形外,水一定是有路径的

  如果这条路径又低又平,就毫无阻挡的流走了

  如果不是很平,那么水会遇到一些瓶颈被阻挡下来

  这个瓶颈就是这条路径上的最大值(高度)

  所以一个格子的最高积水高度,就是所说的xxx的最大值的最小值

  考虑把这信息从一个点拓展到另一个点

  为了保证复杂度,最好每个点只拓展一次

  那么首先要保证这个点是正确的,也就是积水积满

  边界不能积水,所以边界一开始是正确的,所以从边界开始。

  每个点的积水高度一定是它周围(能积水高度)最低的方格

  所以必须要优先拓展答案较低的方格。

  考虑用堆

  

  然后发现已被拓展的区间是个不断扩张的过程,神似那个prim

  所以可以把扩展过程看成带权边(权为$max(w[fm],w[to])$)

  整个过程看成求最小生成树的过程

  反正我是不会。

  T3正解没打,用自己的暴力水过了

  考虑每增删一个数造成的影响(强行把容斥说成莫比乌斯反演)

  $ Contribution(i)=sum limits_{j in S} [gcd(i,j)==1] $

                                   $ =sum limits_{j in S} sum limits_{k|gcd(i,j)} mu(k) $

                                   $ =sum limits_{k|i} mu(k) sum limits_{j in S且 k|j}1 $

  所以开个桶,每增加一个数,就把他所有因数的桶加一,查询一个数就把他因数的桶的大小$ *mu(d) $累加到答案里

  删除同理,增减和查询的顺序需要注意一下

  (话说连续两次想到正解了啥时候能在考试的时候打出来啊)

原文地址:https://www.cnblogs.com/yxsplayxs/p/11363959.html