zoukankan      html  css  js  c++  java
  • BZOJ2962: 序列操作

    Description

      有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问[a,b]这一段区间中选择c个数相乘的所有方案的和mod 19940417的值。

    Input

      第一行两个数n,q表示序列长度和操作个数。
      第二行n个非负整数,表示序列。
      接下来q行每行输入一个操作I a b c或者 R a b或者Q a b c意义如题目描述。

    Output

      对于每个询问,输出选出c个数相乘的所有方案的和mod19940417的值。

    Sample Input

    5 5
    1 2 3 4 5
    I 2 3 1
    Q 2 4 2
    R 1 5
    I 1 3 -1
    Q 1 5 1

    Sample Output

    40
    19940397
    样例说明
      做完第一个操作序列变为1 3 4 4 5。
      第一次询问结果为3*4+3*4+4*4=40。
      做完R操作变成-1 -3 -4 -4 -5。
      做完I操作变为-2 -4 -5 -4 -5。
      第二次询问结果为-2-4-5-4-5=-20。

    HINT

      100%的数据n<=50000,q<=50000,初始序列的元素的绝对值<=109,I a b c中保证[a,b]是一个合法区间,|c|<=109,R a b保证[a,b]是个合法的区间。Q a b c中保证[a,b]是个合法的区间1<=c<=min(b-a+1,20)。


    这题的Q可真是恶星啊,

     发现c小于等于20之后我想肯定是开个数组都存上吧。。。

    但是一时没想出怎么合并区间,其实关键的思想就是这c个数的归属,是左子树还是右子树,这么出发的话就很简单了

    $rt.f[i]=sum_{j=0}^{i}ls.f[j] imes rs.f[i-j]$

    特别的$f[0]=1$

    那么对于区间加法,设一段长度为4的区间${a,b,c,d}$,求$f[2]$

    那么$ab+ac+ad+bc+bd+cd$加k后变成

    $(ab+ac+ad+bc+bd+cd)+3k(a+b+c+d)+6k^{2}$

    试着找出每一项的规律,发现对于每一项的常数项次数

    其实就是从i个连乘"(a+k)(b+k)"中选择i-j个作为k得到的项数总和再除以选出j项的方案数

    具体来说就是这样:

    $frac{C_{i}^{j}*C_{len}^{i}}{C_{len}^{j}}$

    化简得$C_{len-j}^{i-j}$发现这其实就是选完j个数字后,剩下的用k补齐的方案数(?大概

    反正我们已经得到了公式:

    $newf[i]=sum_{j=0}^{i}C_{len-j}^{i-j}*k^{i-j}*f[j]$


    取相反数也是比较好弄的

    奇数项的$f[i]=-f[i]$,剩下的不动就好了

  • 相关阅读:
    在浏览器地址栏按回车、F5、Ctrl+F5刷新网页的区别
    RESTful 的总结
    Mvc项目部署IIS报错:没有为请求的URL配置默认文档,并且没有在服务器设置目录浏览
    Ajax的请求方式几传参的区别
    响应式布局中的CSS相对量
    理解 ES6 语法中 yield* 关键字的作用
    理解 ES6 语法中 yield 关键字的返回值
    配置IIS Express以便通过IP地址访问调试的网站
    在IntelliJ IDEA 13中配置OpenCV的Java开发环境
    iOS UITableView获取cell的indexPath及cell内部按钮点击事件处理
  • 原文地址:https://www.cnblogs.com/2017SSY/p/10421688.html
Copyright © 2011-2022 走看看