码迷,mamicode.com
首页 > 其他好文 > 详细

csp-s模拟91

时间:2019-11-11 21:57:59      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:合并   遍历   级别   有一个   nlog   二分   相等   枚举   处理   

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)\)
?最后统计答案可以线段覆盖或线段树

csp-s模拟91

标签:合并   遍历   级别   有一个   nlog   二分   相等   枚举   处理   

原文地址:https://www.cnblogs.com/Gkeng/p/11838466.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!