zoukankan      html  css  js  c++  java
  • 做题记录

    开学之前博客一直处于咕咕咕状态,原因有两个,第一我懒,第二我没图

    Owen 颓废了一个八月,天天看番,开学前还打了几部 gal...为了防止自己颓废,开了一个博客。


    10.27

    sb 联考,一天 fst 一题,明明能 ak 的挂成 sb,真的 sb。

    昨天 div2 也是,细节没考虑到,fst 了一题,两题没时间打了,真的 sb。

    要好好反省一下了。


    10.26

    打了一下 div2,E,F 都不会。。。

    CF1251:

    E2: 贪心,将 m 从大到小排序,用堆维护。

    F: 注意到集合中一个子集和子集的补集可以对应左右两个序列,然后如果两个数我们可以用两个状态表示它放左边还是右边。


    09.07

    记得构造 (x,y) 选哪个的时候不能 swap!九校 D1T3 就这么挂了。。。


    09.06

    codeforces VP:

    983,1208,1205,925,1137,1214.1178.

    Codeforces Round #545 (Div. 1) (1137)

    A. Skyscrapers

    离散化一下,取个 max 即可。

    B. Camp Schedule

    猜结论,取最长 border。这个东西可以 kmp, 然后就直接构造。

    C. Museums Tour

    暴力拆点,(x,i) 向 (y,i+1) 连边。(5 imes 10^6) 跑 tarjan 有点卡常,而且空间也有点卡。

    D. Cooperative Game

    一道不错的老题,floyd 找环法。一个点速度为 1,一个点速度为 2,这时正好速度为 1 的点在环上的距离 (xequiv -t( ext{mod} c)),然后直接走 t 步就行了。步数大概是 3t+2c。

    E. Train Car Selection

    一道不错的思维题。观察性质,(b,s>0),那么每次放多少个,开头那个始终是最小的,并且若在开头放 0,那么 0 后面的数一定没有贡献,全部删掉。若有 3 操作的话,我们维护两个标记,全局加 k,b。我们对剩下的点维护一个下凸壳,全局加的时候就暴力把结尾不符合下凸壳的数删掉。注意,因为有全局加标记,所以刚开始放结尾的数一定是 ((n,-kn-b)),n 是未加数时的序列长度。时间 (O(m))

    F. Matches Are Not a Child's Play

    一道不错的数据结构题。

    我们先考虑整棵树的最大值和次大值,每次删除的时候肯定是删成只有次大值到最大值的路径,然后从次大值删到最大值。那么我们可以知道肯定是一条条链删过来,这样的话我们用最大值为根,LCT 上每个 splay 维护子树最大值到根的路径。那么现在我们只需要单点查这个点属于哪个最大值,那么答案肯定是最大值<当前最大值的链长+这个点到次大值的距离。

    这个求前缀和是带修的,所以用树状数组维护。加上先前的 LCT,时间 (O(nlog^2 n)),常数很小。


    「2017 山东一轮集训 Day7」逆序对

    题意简述:求长度为 (n) 的逆序对数恰好为 (k) 的排列个数,答案对 (10^9+7) 取模。(nleq kleq 10^5)

    首先,第 (i) 个数可能会和前面的数产生 (0,1,...,i-1) 个逆序对,所以答案等价于求 (0leq a_ileq i-1,a_1+a_2+...,a_n=k) 的方案数。

    解法一:(口胡)

    类似付公主的背包,考虑生成函数 (F(x)=1 imes (1+x) imes ... imes (1+x+x^2+...+x^{n-1}))

    然后我们找规律找出 ( ext{Ln} (1+x+x^2+...+x^n)),调和级数算一算,多项式 ( ext{Exp}) 算一算。不过模数不是 (998244353),要用 (MTT)

    时间复杂度 (O(nlog n))

    解法二:

    我们曾解决过一个 (naive) 的问题,求 (a_1+a_2+...a_n=k) 的方案数,但其中有 (m) 个数有限制,其中 (a_{p_i}<b_i)(mleq 20)

    我们知道上界不好处理,考虑容斥,枚举哪几个数突破限制,强制令这些数 (a_{p_i}geq b_i),然后就可以把 (k-b_i),转换成 (simple) 的问题——不定方程的非负整数解个数。

    (a_1+a_2+...a_n=k),那么不定方程非负整数解的个数为 (Large{n+k-1choose k-1})

    现在我们也类似刚刚的方法,但这个上界比较特殊,我们可以 (dp)(f[j][i]) 表示选了 (j) 个数超过限制,(sum b=i) 的方案数。

    我们发现 (dp) 可以转换成有一个容量为 (k) 的背包,物品体积为 (1,2,...,n)每个物品只能放一次,求方案数。

    如果我们直接背包的话是 (O(n^2k)) 的,所以考虑优化,至少我们不能枚举物品体积。

    因为这里物品的体积是 (1,2,...,n),所以超出限制的数的个数不会超过 (sqrt{2k}) 个。我们再转换问题,求有多少个上升序列长度为 (j),和为 (i) 时,其中的数 (in [1,n])

    因为是上升序列,我们逆向差分一下,令 (b_i=a_i-a_{i+1}),那么序列的和就变成了 (sum_{k=1}^{j}b_k imes k),我们也只用保证 (b_k>0)

    这样就好 (dp) 了。

    对于一个长度为 (j),和为 (i) 的差分后的序列,我们可以把最后一个数 (+1),也可以在最后添加一个 (1)(f[j][i]=f[j][i-j]+f[j-1][i-j](igeq j))

    但是我们可能会出现 (a_1>n) 的情况,这时我们令 (a_1=n+1)(f[j][i]-=f[j-1][i-n-1](i>n))

    为什么令 (a_1=n+1) 是对的呢?

    因为每次 (a_1) 最多 (+1),每当 (a_1=n+1) 时,就会把不合法的减掉。如果从状态 (n+i) 转移到 (n+i+1),那么前面 (j-1) 项和为 (0,1,..,i-1) 时的情况都被减过了,只用再减去和为 (i) 的情况就行了。

    这样愉快的 (dp) 部分就结束了。

    现在只要枚举超过的和 (i),把 (dp) 完的值乘上容斥系数后加起来再乘上 (Large{k-i+n-1choose n-1})就行了。

    时间复杂度 (O(ksqrt{k}))


    最近啃了一篇 rxd 的论文,关于树上连通块问题的,总结一下。

    • 若连通块包含根,可以按照 dfs 序转移,用背包确定切掉哪些子树。

    • 点数-边数=1,可以配合上一条使用,就是算出强制包含一个点-强制包含一条边的方案数,具体见完美的集合,因为有个组合数取模我没做。

    • 用线段树合并维护整体 dp,PKUSC2019D2T1 就是整体 dp 的板子题,在线段树上维护加法和乘法标记。有一些 dp 是在叶子结点只有有限个状态,可以不用线段树合并,用平衡树合并,比如 ZJOI2019 Minimax 搜索和 PKUWC2018 Minimax。

    • 若是连通块最优化或计数问题,可以在深度最浅处统计答案。如 Qtree6,7。

    • 动态 dp,一般写树剖就够了,除非出题人恶意卡。对于一些乘法形式的 dp,我们选择记录答案和 0 的个数,额外开个结构体使 0 值可除。

    • 基于 LCT 的数据结构 Top Tree (没学,咕咕咕)


    脑子不够用了,一些 sb 状压 dp 都想不出来,总结一下。

    • 最小/最大表示法,以最小/最大值表示一个集合,若有多个最小值用编号最小的那个。

    • 一个 dp 状态难转移,就开两个,如限制每个点子树大小的有根树计数,可以用树/森林的方案数来表示状态。

    • 二进制不好表示状态,可以用三进制,如给你一个最长上升子序列方案数。

    • 枚举子集 (O(3^n))

  • 相关阅读:
    JAVA线程池管理及分布式HADOOP调度框架搭建
    技术人员如何创业《二》 合伙人的模式
    JavaScript中的运动数学函数(持续更新)
    JavaScript中的加号
    JavaScript 函数绑定 Function.prototype.bind
    基于C#的波形显示控件的实现[附完整源码下载]
    JavaScript中的声明提升
    JavaScript & HTML5 Canvas 概览 更新时间201404111805
    《编写高质量代码——Web前端开发修炼之道》读后随笔
    B树/B+树/二叉搜索树/AVL树/红黑树
  • 原文地址:https://www.cnblogs.com/owencodeisking/p/11475519.html
Copyright © 2011-2022 走看看