• csp-s模拟110


    倒计时三天。

    这场又是巨头们的AK场,大众分200+,貌似真实的csps?

    然而T1又炸了,$1<<62$暴int,要$1ll<<62$。T2试图打70部分分,T3也只会40分,可能省一卡线了。

    最近做题不认真,没有思考,思路一直是歪的,不想正解,太想乱搞。态度有点消极。

    T1:

      如果没有下界限制,一定是把R的每个$0$位或上$1$。有了$L$的限制,找到$L$和$R$从高到低位第一个不同的位,在此位一个数取$1$,其余往后全$0$,另一个数在此位取$0$,后面全取$1$即可让这一位后或起来全是$1$。

    T2:

      如果直接dp出随机答题者的得分概率,进行前缀和找出第一个大于等于$P$的位置即可。但是时间、空间双双超限。再转化一下,先把随机答题者的所有得分方案枚举出来,答案就是总方案数($2^N$)乘上概率$P$(向上取整)的位置上的得分。直接枚举更是不行。而数据范围$N=40$可以考虑折半搜索。分别枚举得到用前一半题和后一半题的得分方案集合,接着求两个集合中取数之和的第$lceil 2^N*P ceil$大。二分答案。对两个集合排序,一边扫,一边用单调指针便可以$O(2^{frac{N}{2}})$  $check$一次比$mid$小的个数。

    T3:

      合法点对就是距离为$2$并且不是三元环的点对。

      对于求和,用一个小容斥。先求出任意距离为2的点对的联合权值,减掉三元环的。前者直接用一点权值成上 相邻点的相邻点的权值和 并减去自己重复的权值的平方。考虑如何找三元环。

      一种方法是,先把原图构造成有向无环图:按(度数大小,点编号)的大小确定无向边的方向,然后便可以枚举起点,标记中间点,判断每个中间点是否可达另一个中间点。具体三层循环枚举点、边、点。前两层总和$M$,第三层是点的出度。实际上总的是所有有向边的终点的出度和。对于出度小于$sqrt M$的点,枚举总和小于$M*sqrt M$,对于度数大于$sqrt M$的点,这样的点的数量不会超过$sqrt M$,因为所有点度数和为$2*M$,这样的枚举总和也小于$M*sqrt M$。所以三元环最多$M*sqrt M$个,复杂度亦$O(M*sqrt M)$。

      还有一种不优秀的方法:$bitset$临接矩阵,压与某一点直接相连的点,枚举边,$bitset::count()$求相邻两点 的相邻点 的交集大小,减掉相应贡献。理论复杂度$O(frac{N^2}{32})$。

      对于最大值,从大到小枚举合法点对一定最优。排序相邻点。枚举中间点,找到第一个合法的最大点对就可以。最多枚举次数也就是三元环的数量。$O(M*sqrt M)$。

      由于点数多,边稀疏,判两点直接联通可以哈希/unordered_map压临接矩阵,两点压成30位整形。

  • 相关阅读:
    docker 常用命令
    docker 部署安装
    Dockerfile
    Docker挂载本地目录
    es的基本理论与简单操作
    第一个gradle工程
    记录下自己git命令
    flink 自定义 mysql source
    flink kafka source
    flink file source
  • 原文地址:https://www.cnblogs.com/Duan-Yue/p/11838559.html
Copyright © 2020-2023  润新知