zoukankan      html  css  js  c++  java
  • 【2018.10.20】CXM笔记(思维)

    1. 给你个环状字符串,问从哪个地方拆开能使它的字典序最小。

    先预处理任意子串的哈希值。

    然后枚举拆点,将它与当前最优的拆点比较谁更优(就是从哪拆的字典序更小),具体方法是二分+哈希找出两串最长的相同前缀(2018.10.21 update:也可以倍增预处理哈希值,然后),然后比较这个前缀后的第一个字符,就判断出谁的字典序更小了。

    2. $Mle 10^9,x=1,A_ile 10^9,Qle 10^5$。有两种操作,一种是 $x*=A_i$,一种是求$x/A_kmod M$($k$为一给定值)。

    3. $C∈P,Cle 2*10^5$,$k_1,k_2,b_1le 10^9$,求$(a,b)$对数,使$1le a,ble C$ 且 $∀n∈N+$ 且 $a^{k_1*n+b_1}+b^{k_2*n-k_2+1}equiv 0 (modspace C)$。

    把$n=1,2,3,...$等情况代进去推结论就好了。

    4. 给你一个$W*H$的矩阵,再给你一些询问的答案(询问一个子矩阵的最大值),问有多少种满足条件的原矩阵。$1le W,Hle 10^4, 0lt a_{i,j}le 10^4, Qle 10$。

    先离散化询问矩阵,把非询问边界的行列离散化掉。

    把询问按照答案从大到小排序,对每块染不同的色(颜色=询问的最大值,后染的覆盖先染的)。最后对每种颜色的连通块计算答案(情况数=颜色对应最大值*连通块大小(就是离散化前的))。

    但是很快发现如果答案相同的块重叠了,上述方法就挂了。(因为在如果重叠区域没有最大值,两边的非重叠区域就都要放最大值,而不能只放一个)

    所以对于多个答案相同的询问,把这些询问区域的全集的每一块按照覆盖次数分组,具体方法就是把每个矩阵内所有位置的编号$+2^k$($k$随编完号的询问的数量的增多而增加,初始为$0$)

    其实就是二进制编号。

    然后设$f(i,s)$表示处理完前$i$个询问区域后,已经有一个最大值的区域集合。

    那么如果当前区域放最大值,$f(i-1,s)$就转移到$f(i,s|g(i))$,其中$g(i)$表示覆盖第$i$个区域的原矩阵

          如果当前区域不放最大值,$f(i-1,s)$就转移到$f(i,s)$。

  • 相关阅读:
    高级打字机
    不等数列
    间谍网络
    医院设置
    题目编号生成器
    传纸条
    聪明的打字员
    倒水问题
    八数码难题
    生日蛋糕
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/9821775.html
Copyright © 2011-2022 走看看