zoukankan      html  css  js  c++  java
  • Tokio Marine & Nichido Fire Insurance Programming Contest 2020 English

    D

    设阈值(L),预处理(ile L)的祖先最优背包
    对于一次询问,(i>L)的部分可以状压

    E

    显然,题目可以直接转化为(S=0,T=2^L-1)(A_iin[0,2^T))
    (f(U))为集合大小(in[1,K]),集合中所有数(And U)相同的个数
    (ans=sumlimits_{U}(-1)^{popcount(U)}f(U))

    证明:
    考虑对于集合大小(in[1,K])的集合,被统计了几次
    这时(f(U)的意义可以描述成:)U$中的位上为(1)时是否集合上该位相同,剩下的比较显然了

    考虑如何计算(f(U)),枚举每个(U),然后(O(N))遍历(a_i)
    (O(2^LN))

    没有用到任何高级算法,非常巧妙!!

    令一种稍劣的方法
    (S=0,T=2^L-1)的意义在于,选择的集合每一位出现过(0)(1)
    固定集合内的一个元素,然后要做的事就变成:找到一个集合,使得集合中的位出现过某个数字,可以通过fwt配合容斥解决

    具体来说,现在的问题可以描述成选择一个集合,其与为(0)
    (f(U))(a_iAnd U=U)的个数,令(g(i)=sumlimits_{j=0}^{k-1}{ichoose j})(sumlimits_{U}(-1)^{popcount(U)}g(f(U)))
    证明同上

    (O(ncdot L2^L))

    F

    不失一般性地,我们来统计((0,i),(j,0)(W,k)(ile k))
    (d=k-i)

    由毕克定理,三角形内部点数(A),边界上点数(B),三角形面积(S),有

    [2S=2A+B-2 ]

    整理

    [egin{aligned} &(2i+d)W−ij−(W−j)(i+d)=2A+(i,j)+(W,d)+(W−j,i+d)−2\ &iW−(i,j)−(W−j,i+d)=2A+(W,d)−2−dj\ end{aligned}]

    需要计算三元组((i,j,d))的个数,其满足:(iW−(i,j)−(W−j,i+d)le 2K+(W,d)−2−dj)
    固定((j,d)),右侧是定值,令其为(R)
    由于((i,j)+(W−j,i+d)le W),当(ile frac{R}{W})时恒满足,(ige frac{R}{W}+1)时恒不满足
    仅需格外计算(i=frac{R}{W}+1)即可

    ((j,d))使得(Rge 0)的个数(O((K+W)log(K+W)))

  • 相关阅读:
    漫谈 C++ 的 内存堆 实现原理
    我发起了一个 .Net 开源 数据库 项目 SqlNet
    谈谈 数据库原理
    论 数据库 B Tree 索引 在 固态硬盘 上 的 离散存储
    论 东坡肉 和 红烧肉 的 区别
    浅谈 操作系统原理
    引子 初识
    P2P Downloader
    利用 MessageRPC 和 ShareMemory 来实现 分布式并行计算
    MessageRPC
  • 原文地址:https://www.cnblogs.com/Grice/p/13199865.html
Copyright © 2011-2022 走看看