zoukankan      html  css  js  c++  java
  • csp-s模拟91

    T1:
      分析发现,由于(1+2+3+...+x = (1+x)*x/2)(x^2)级别的
      所以若总牌数为n,那么牌堆数量的种类数的级别是(sqrt{n})的,所以暴力就好了……
     
    T2:
      考虑对每一个位置进行一次dp
      若当前考虑的位置为p,考虑影响该数最后位置的数只有和它相等的数
      那么模拟归并的过程,不妨考虑在某一次归并时,p在左边
     
      设(g_i)表示上一层p排在第i位的概率,(g'_i)表示这一层p排在第i位的概率
      再预处理出一个数组(f_{i,j})表示归并时左右两指针分别指向第i位和第j位的概率
     
      那么g'的转移是:(g'_{i+j} += g_i*f_{i,j+1}/2) 发现WA了……
     
      考虑哪里错了,发现当右边的数全部都选的情况,概率并不是(f_{i,j+1}/2)
      因为(f_{i,j+1})是保证右指针停在j+1不向上的,但实际情况中右指针已经扫完了,并不需要保证不上跳
      这时的概率变为$sum_{k=1}^i f_{k,j}/2 $ (这个也需要预处理)
      即:枚举i扫到什么时候时j停下来
     
      最后答案中的位置还需要加上小于(a_p)的数的个数
     
    T3:
      首先有一个常用的结论:or和and最多变化log次(gcd也是)
     
      可以枚举左端点
      从左向右二分找到or和and都相等的log段
      然后再二分最右侧的满足条件的点
      发现复杂度是(O(nlog^2n)) 过不去QAQ
     
      发现其实只需要最长的合法段即可
      所以有两种解决方法:
     
      1.将刚才的过程倒过来做,即从右向左二分找到or和and都相等的log段
      (需要多处理一个or和and的st表)
        对于每个右端点二分找到一个左端点
        若左端点不满足条件,那么这段一定都不满足条件
        若左端点满足条件,那么在这段中二分找到最右的满足条件的点,即为最长的合法段
      2.枚举右端点,维护or和and相同的段
        考虑右端点拓展的时候这些段如何变化
        发现只会合并一些段,所以可以每次加入([i,i])这个新的段,然后再合并这次变化导致的相同的段
        具体可以用链表实现
        然后每次从前向后遍历链表,找到第一个可能包含合法答案的段,然后在这段上二分即可
     
     这两种优化都可以将复杂度优化至(O(nlogn))
     最后统计答案可以线段覆盖或线段树

  • 相关阅读:
    大三进度条01
    阅读笔记01
    问题账户需求分析
    《人月神话》阅读笔记02
    《人月神话》阅读笔记01
    每周总结(第五周)
    《构建之法》阅读笔记06
    《构建之法》阅读笔记05
    《构建之法》阅读笔记04
    《构建之法》阅读笔记03
  • 原文地址:https://www.cnblogs.com/Gkeng/p/11838466.html
Copyright © 2011-2022 走看看