zoukankan      html  css  js  c++  java
  • noi前第十四场 题解

    A. ⼩W数排列

    做过类似的题,思路大概将所有数从大到小插入。
    这样相邻两个位置的贡献就转化为一加一减。

    可是这样做会导致值域变得很大,其实这样没用到题中 (l) 很小的限制。
    考虑这样一个做法,把每次一加一减的贡献差分掉。
    每次基准线降低的时候直接统计 降低的高度*降低的个数 的贡献。
    因为这个贡献是不降的,所以维护到 (l) 就够了。
     

    B. ⼩W玩游戏

    容易发现行列之间是没有关系的,每次的操作就是改变一行一列的奇偶性。
    可以首先处理出选 (i) 个奇数行的方案数 (f_i),选 (j) 个奇数列的方案数 (g_j)
    那么它们对答案造成的贡献为 ([i(m-j)+j(n-i)leq k]f_ig_j)

    (f,g) 的做法是一样的,考虑其中一个。
    考虑用 (EGF) 分配对每一行的操作,有这样一个式子。

    [f_i=inom{n}{i}q![x^q](frac{e^x+e^{-x}}{2})^{n-i}(frac{e^x-e^{-x}}{2})^i ]

    用一个小技巧,可以发现 ((e^x+e^{-x})+(e^x-e^{-x})=2e^x),所以用 (2e^x-(e^x+e^{-x})) 替换 (e^x-e^{-x})
    这样就会发现上面的式子可以暴力二项式定理化成卷积式了,所以可以求出 (f,g)

    对于能造成贡献的 (i,j) 点对,容易发现对于 (i) 确定,(j) 一定是一段前缀或者后缀。
    所以解一下这个不等式,注意讨论 (n-2i) 的取值就好了。
     

    C. ⼩W维护序列

    考虑 (opt=1) 应该怎么做,目的是求出选出三元组,满足形成三个集合的乘积和。
    与集合有关,做法是用枚举置换来容斥。
    其实与斯特林反演比较类似,但是这里不仅枚举环的个数,还枚举每个环的大小,更加具体化一点。
    所以可以得到 (ans=s_1^3-3s_1s_2+2s_3),其中 (s_1,s_2,s_3) 分别为不同的数的权值和、平方和、立方和。
    对于 (opt=5),问题是不同的数的个数和,其实就是 (s_0)
    所以不涉及插入删除的操作实际上就是简单的二维数点,用树套树就可以做了。
    对于涉及插入删除的操作,其实这题可以离线,所以离线搞一搞在平衡树上二分找排名就行了。
    但是简单的树套树需要 (O(nlog^2n)) 的空间,其实对于第一棵树上的每一个节点,都把操作和询问离线下来就好了。

  • 相关阅读:
    NOIP模拟测试7
    BigInt类
    bzoj 2733 [HNOI2012]永无乡 并查集+平衡树
    bzoj 2752 [HAOI2012]高速公路(road) 线段树
    bzoj 1584 Cleaning Up 打扫卫生 dp
    201709 半集训
    [SHOI2014]概率充电器 dp
    NOIP2016 天天爱跑步
    [HNOI2011] 数学作业
    [Poi2012]Festival
  • 原文地址:https://www.cnblogs.com/skyh/p/13388863.html
Copyright © 2011-2022 走看看