• [TJOI2019]甲苯先生的线段树


    题意

    对于(d)层完全二叉树,(T)次查询,给定(a,b),求(a,b)路径编号和(x),以及树上有多少条路径编号和为(x)(dle 50,Tle 10)

    做法

    (cnt(x))(x)二进制中(1)的个数
    结论1:点(x)到根路径和为(2x-cnt(x))。在树根为(1)(0)时均成立。

    证明:
    没想到什么简单的办法,暴力归纳一下即可

    结论2:记路径和为(s),两端为(x,y),令(z=lca(x,y)),若(zlongrightarrow x)经过(a)条边,(zlongrightarrow y)经过(b)条边。若(s,a,b)为定值,(z)也为定值

    证明:
    (s,a,b)为定值
    (z)的二进制有(t)位,则整条路径上的点前(t)位是确定的,显然整条路径前t位之和为((2^{a+1}+2^{b+1}-3)z)
    (k)为其他贡献:(k)的最小值为(x)一直往左走,(y)往右走一步后一直往左走;(k)的最大值为(x)往左走一步后一直往右走,(y)一直往右走。故(kin [2^b-1,2^a+2^{b+1}-a-b-3])
    因为(k<2^{a+1}+2^{b+1}-3),所以(z)是定值,为(frac{s}{2^{a+1}+2^{b+1}-3})
    (k=s\%z),即除开前(t)位的贡献,令(x,y)除掉前(t)位后位(x',y'),根据结论1(2(x'+y')-cnt(x')-cnt(y')=k)。显然得满足(x'<2^{a-1},y'<2^b)(y')(b)位为(1)

    然后这题就只用先算出(s),枚举(a,b),转化问题为求有多少个(x',y')满足上面那个条件

  • 相关阅读:
    node连接mysql数据库
    mysql重置密码
    CSS vertical-align 属性
    JS中常用的字符串方法
    JS中的常用数组方法
    获取下拉菜单中具有SELECTED属性元素的序号和值的方法
    基本的正则表达式符号
    让多个文本输入框左侧对齐方法
    CSS选择器权重对比
    让内联元素支持宽高的几个设置
  • 原文地址:https://www.cnblogs.com/Grice/p/12684094.html
Copyright © 2020-2023  润新知