zoukankan      html  css  js  c++  java
  • 清华集训2016做题记录

    清华集训2016做题记录

    已完成

    未完成

    我好菜啊,每道题都要贺来贺去,剩下的题咕了,几何写不动,数据结构太胖,题答题会玩。

    【清华集训2016】Alice和Bob又在玩游戏

    这显然是一个平等博弈,考虑用 ( ext{SG}) 定理解决,即 (SG(u)) 为以 (u) 为根的子树做为一个游戏的 (SG) 函数值,那么我们要求的就是 (u) 的后继集合的 ( ext{mex})

    对于选 (u) 子树内点 (v) 的决策,该后继的集合的 (SG) 值为删去 (u ightarrow v) 这条链后每个子树根的 (SG) 值异或起来,对于子树内每个点 (v),当前根的游戏里选 (v) 得到的 (SG) 值,那么每次加入一个祖先相当于给这个值异或上某个值。

    问题等价于支持一个集合异或上一个值,合并两个集合,查询一个集合第一个没有出现的元素,那么用线段树合并即可,区间异或相当于打一个翻转标记。

    【清华集训2016】魔法小程序

    这个程序在做的事情是, 令 (d_{i,j}=lfloor frac{b_i}{prod_{k=1}^{j-1}a_k} floormod a_j),对于每一个 (d_i) 求一个高维前缀和。

    那么我们要做的事情就是还原这个高维前缀和,枚举每一维减一下就好了,卡空间差评。

    【清华集训2016】如何优雅的求和

    考虑用下降幂多项式 (f(x)= sum_{i=0}^n a_i x^{underline{i}}),那么有:

    [egin{align} Q(f,n,x) &= sum_{k = 0}^{n}f(k){nchoose k}x^k(1 - x) ^{n - k} \ &=sum_{i=0}^nsum_{j=0}^ma_ji^{underline{j}}{nchoose i}x^i(1 - x) ^{n - i} \ &=sum_{i=0}^ma_isum_{j=0}^nfrac{j!}{(j-i)!}frac{n!}{(n-j)!j!}x^j(1-x)^{n-j} \ &=sum_{i=0}^ma_isum_{j=0}^nfrac{n!}{(n-j)!(j-i)!}x^j(1-x)^{n-j}\ &=sum_{i=0}^ma_in!sum_{j=0}^nfrac{x^j}{(j-i)!}frac{(1-x)^{n-j}}{(n-j)!} \ &=sum_{i=0}^ma_ix^in!sum_{j=0}^nfrac{x^{j-i}}{(j-i)!}frac{(1-x)^{n-j}}{(n-j)!}\ &=sum_{i=0}^ma_ix^in![x^{n-i}](e^xe^{1-x})\ &=sum_{i=0}^ma_ix^ifrac{n!}{(n-i)!} end{align} ]

    我们要将一个点值转成一个下降幂多项式

    [b_i=sum_{j=0}^ma_jfrac{i!}{(i-j)!}\ frac{b_i}{i!}=sum_{j=0}^mfrac{a_j}{(i-j)!} \ ]

    (A(x)=sum_{i=0}^m a_ix^i)(B(x)=sum_{i=0}^m frac{b_i}{i!} x^i) ,那么就有 (A(x)=frac{B(x)}{e^x})

    其实插值就过了,然而贺之前并没有想到这是一个 (m+1) 次多项式

    【清华集训2016】石家庄的工人阶级队伍比较坚强

    设剪刀为 (0) ,石头为 (1),布为 (2) ,这个胜负关系就是三进制不退位减法,那么 (x)(y) 玩一轮比赛的贡献就是 (B[cnt1(xominus y)][cnt2(xominus y)]) ,记这个值为 (b_{xominus y},f_x) 为上一轮结束时 (x) 的得分 (F_x) 为这一轮结束时 (x) 的得分那么有

    [F_x=sum_{y}f_yb_{xominus y} \ F_k=sum_{xoplus y=k}f_xb_y ]

    我们要求的是 (F imes b^T)

    本质也就是一个三进制不进位加法的卷积,高维FWT即可。

    考虑傅里叶变换的时候是做这样一件事情记 (B_i) 为点值 ,(A_i) 为系数,

    [B_i=sum_{j=0}^nomega_{k}^{ij}A_j ]

    上面那个式子本质上是一个向量乘范特蒙德矩阵

    [T_n = egin{bmatrix} 1 & 1 & 1 & ldots & 1 \ 1 & omega_n ^ 1 & omega_n ^ 2 & ldots & omega_n ^ {n - 1} \ 1 & omega_n ^ 2 & omega_n ^ 4 & ldots & omega_n ^ {2(n - 1)} \ ldots & ldots & ldots & ddots & ldots \ 1 & omega_n ^ {n - 1} & omega_n ^ {2(n - 1)} & ldots & omega_n ^ {(n - 1)(n - 1)} \ end{bmatrix} ]

    逆矩阵是

    [T_n ^ {-1} = frac{1}{n} egin{bmatrix} 1 & 1 & 1 & ldots & 1 \ 1 & omega_n ^ {-1} & omega_n ^ {-2} & ldots & omega_n ^ {-(n - 1)} \ 1 & omega_n ^ {-2} & omega_n ^ {-4} & ldots & omega_n ^ {-2(n - 1)} \ ldots & ldots & ldots & ddots & ldots \ 1 & omega_n ^ {-(n - 1)} & omega_n ^ {-2(n - 1)} & ldots & omega_n ^ {-(n - 1)(n - 1)} \ end{bmatrix} ]

    (感谢愤怒的种狗教我这个题并给我这两个矩阵)

    那么这个题就是 (k=3) 的情况,枚举每一维做直接套上面那个线性变换就好了。

    比较恶心的一点是直接用单位根会爆精,要考虑模意义下的单位根,但单位根解出来是 (omega = frac{-1 + sqrt 3 i}{2}),所以还要扩域在 (ar+bsqrt{3}i) 域上做。

    【清华集训2016】你的生命已如风中残烛

    根据 Raney 引理可以得到一个结论,对于所有和为 (1) 的整数序列,其所有圆排列中有且仅有一个满足所有的前缀和都大于 (0)

    先证明至多存在一个,考虑反证,假设存在两个位置 (x, y) ,满足以 (x,y) 为第一个元素的排列部分和均为大于 (0) ,那么 (x)(y) 的两条路径和均 (>0) ,也就是说整个序列的和 (>1) ,与整个序列和为 (1) 矛盾。

    考虑证明至少一个,构造一下,随便钦定一个第一个元素,找到第一个前缀和 (leq 0) 的位置 (x) ,如果不存在这样一个位置就已经构造出来了。那么此时钦定 (x+1) 为第一个元素,可以得知 (x+1) 到原先结尾的所有前缀和都是大于 (0) 的,又因为原先第一个元素到 (x-1) 所有前缀和都是大于 (0) 的,这样就构造出来了。

    这个时候再大力搞一搞,先把所有卡的值 (-1) ,然后再在随便加一个 (-1) 的元素,那么要求的排列满足除最后一位外任意时刻前缀和 (geq0) ,类似的证明过程会发现一个圆排列只有一个满足,且满足的圆排列最后一位一定是 (-1) ,最后去一下标号就得到了答案为 (frac{m!}{m-n+1})

    【清华集训2016】温暖会指引我们前行

    因为要字典序最大化一个瓶颈路一样的东西,不难发现每次走的路径一定是温度的最大生成树上的路径,那么只需要用LCT维护一下这个最大生成树就好了。

    【清华集训2016】组合数问题

    先卢卡斯定理

    [sum_{i=0}^nsum_{j=0}^n [{ichoose j}equiv0(mod k)]=sum_{i=0}^nsum_{j=0}^n [{lfloorfrac{i}{k} floorchoose lfloorfrac{j}{k} floor}{i mod k choose j mod k}] ]

    考虑一直做下去会得到若干个 ({x_ichoose y_i},x_i,y_i < k) 的形式,如果当中某一步出现 (y_i > x_i) ,那么最终的结果就为 (0),否则一定不为 (0)

    这个 (x_i,y_i) 实际上就是 (i)(k) 进制下的每一位,那么我们直接把 (n,m) 放到 (k) 进制下就可以直接做数位DP了。

    具体来说每次就记一下大小关系已经是否已经出现了一位 (y_i >x_i) ,一开始处理的时候细节比较多。

    【清华集训2016】汽水

    比较明显的分数规划,二分一个答案为 (mid) ,那么利用初中不等式知识就可以转化题意了。

    [|frac{sum w_i}{size}-k|leq mid \ (k-mid)sizeleq sum w_ileq(k+mid)size \ ]

    (k_1 =k-mid,k_2=k+mid,W_1=sum w_i-sizek_1,W_2=sizek_2-sum w_i)

    显然 (W_1,W_2) 可以直接合并,而我们的目标是判断是否存在一条路径 (W_1geq 0)(W_2 geq 0) ,点分后扫描线加two-pointer即可。

  • 相关阅读:
    19Jinja2中宏定义
    18FlaskRESTful
    装饰器与闭包
    Linux下Flask环境
    1,github更新问题
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
    利用Java编码测试CSRF令牌验证的Web API
    利用Jmeter测试CSRF令牌验证的Web API
    以百度天气预报查询API 服务为例,创建Jmeter JavaSampler请求范例
    Dubbo-demo实例写作
  • 原文地址:https://www.cnblogs.com/mangoyang/p/11787269.html
Copyright © 2011-2022 走看看