zoukankan      html  css  js  c++  java
  • Review 2020.10.11

    (这篇当时忘记发了)

    Review: 2020.10.01 - 2020.10.11


    给定一个序列,求它的 k 阶前缀和和 k 阶差分。

    前缀和即与 (1/(1-x)) 卷积,差分即与 (1-x) 卷积。多项式求逆 + 多项式快速幂即可。


    给出 n 个排成一排的一模一样的求,要从中选出一些球进行分组,每组中的个数只能为 1,2,求取出 1,2,3,...,k 组的方案数分别为多少。

    设 f[i][j] 表示前 i 个球中已经取出了 j 组的方案数,则有 f[i][j]=f[i-1][j]+f[i-1][j-1]+f[i-2][j-1]。考虑从中间断开即将 n 分为 a+b,枚举断点处的两个求是否相连,这样可以得到另一个转移方程。将两个方程写成多项式形式,可以对三元组 ((F_n,F_{n-1},F_{n-2})) 做倍增 FFT。


    求 n 个点的简单有标号无向连通图数目。

    设 f(n) 为无向连通图数目,g(n) 为无向图数目,则 g(n) 显然,对 g(n) 枚举其 1 号点所在的连通块大小,得到一个方程,展开变形后利用多项式求逆即可。


    有一排发生了滑坡,初态下他们的高度是严格单增的。每一轮滑坡前,如果 (h[i]+2 le h[i+1])(h[i+1]) 移动 (1)(h[i]) 上,在同一轮中所有位置的变化是同时的,问无穷轮后每一座山的高度是多少。

    操作顺序无关,末态下相邻且相等的对数不会超过 (1),于是 sum 和 n 两个参数确定了唯一的答案序列。从序列 (0,1,...,n-1) 开始每次暴力对尽可能长的前缀 +1 即可。


    有 n 种物品,每种有若干个权值不同,要选出 m 种物品各 1 个使得权值极差最小。

    双指针,枚举左端点维护右端点,用桶维护即可。


    n 个点的树,从 1 号点出发,经过一条边会损失边权,首次到达一个点会获得点权,边最多只能经过两次。求遍历所有点并回到原点的方案中的积分极小值最大是多少。

    设访问 i 子树过程中的最大极小值为 f[i],子树 i 中遍历的积分贡献总和为 s[i],在转移时我们需要确定访问各个子树的顺序。如果先 i 后 j 更优,那么 min(f[i],s[i]+f[j]) > min(f[j],s[j]+f[i]),将所有孩子按照 s[i] 正负分为两部分,显然 s[i]>=0 的一定排在 s[i]<0 的前面,至于两部分内部,对 s[i]>=0, s[j]>=0 的情况,f[i]>f[j] 即可;对于 s[i]<0, s[j]<0 的情况,s[i]-f[i]>s[j]-f[j] 即可。


    给定一个 01 矩阵,求其中有多少个连续子矩阵,满足矩阵的最外面一层是 1 中间的 01 个数相差不超过 1。

    考虑枚举上下边界,先沿着横方向预处理能用的区间,在每个能用的区间内,列全为 1 的称为合法点,对合法点的前缀和用桶维护即可。


    给定一个长度为 n 个序列,判断它是否是一个由 1-k 全排列顺序连接起来的序列的子串。

    考虑每个元素出现的位置 pos 和它上一次出现的位置 lastpos,如果其间的距离不超过 k 那么 [lastpos,pos-1] 中一定有一个分割点。环上差分有点麻烦,考虑直接模拟,用 sum 记录当前的前缀和,每经过一个位置就将这个前缀和加到这个位置取模后对应位置的 ans 上即可。


    (n imes n) 的网格图的边染 k 种颜色,要求每种颜色染的边数相同,不存在同色环,也没有完整的一行或一列的颜色相同的方案数。

    先考虑两种颜色怎么做,如果 n 为奇数则直接按奇偶性构造,如果 n 为偶数则蛇形构造。考虑 k 种颜色时,我们可以从两种颜色的情况调整得到。如果 k 是偶数那么我们直接从原先的颜色里随便分一些给新颜色即可,如果 k 为奇数则先挑一些分给多出来的那一种颜色,然后转化为偶数种颜色的问题。


    (1 le a le b le n) 中满足 (S(a)>S(b))((a,b)) 个数,其中 (S) 表示数位和。

    (f(i,d,x,y)) 表示已经确定了最高的 i 位,两数字的数码和的差为 d,b 与 n 的大小关系为 x,a 与 b 的大小关系为 y,转移时暴力枚举最后一位数字即可。


    给定一个长度为 n 的排列和 m 次操作,每次操作对排列进行 x 次 k-约瑟夫变换,求末态排列。

    难点在于求 k-约瑟夫变换。设上次取出的数字是第 pos 个,当前还剩下 cnt 个数字,那么下一次选出来的数是当前剩下的所有数字中第 (pos-1+k-1)%cnt+1 个,在线段树上二分即可。


    给定一个长度为 n 的排列,每次可以选择一个子集将它 random_shuffle,花费子集大小的代价,求将整个排列升序排序的代价期望。

    考虑排列的图表述,我们每次取一个完整的环操作一定不会使得答案更劣,并且操作的结果与这个环上各个点的熟悉无关,只需要考虑换的大小,因此我们设 f(n) 表示解决一个大小为 n 的环的期望代价,那么只需要枚举变换后 1 号元素所在的环大小即可,化简并运用一些技巧得到 f(n) 的递推式。


    给定 n 条边的长度,任选三条边组合,求能组成三角形的概率。

    首先预处理两条边(可以重复,不限顺序)时每种长度对应的方案数 c[i] 并修正为组合情况,然后枚举最长边来算答案,注意需要减去两条边一大一小、两大、选重该边的方案数。


    给定一个序列,求所有子区间的 max 和 gcd 乘积的和。

    考虑枚举右端点不断向右移动,同时维护 f[i] 表示 a[i..r] 的 max,g[i] 表示 gcd,维护 next[i] 表示最大的满足 g[next[i]]!=g[i] 的位置,注意 g[i] 只需要部分正确即可,这样 f[i] 可以用线段树和单调栈维护,g[i] 暴力维护即可。


    定义 f(s,t) 表示最大的 i 满足 s 的长为 i 的前缀和 t 的长为 i 的后缀相等,给定 n 个字符串 s1,s2,...,sn,求所有 f(si,sj) 的平方和。

    考虑哈希,将每个后缀存入桶汇总,先不考虑 f(s,t) 的最大,而考虑所有满足条件的和,那么暴力扫描每个前缀,设桶中有 k 个后缀与它匹配,则对答案的贡献为 (kl^2),考虑其中的重复,这种情况发生是因为我们枚举的前缀有一个非空的 Border (s[1..j]),我们需要减去它的贡献,注意这里用的匹配数目应当是本次的匹配数目。


    给定 n 个区间,每个区间有 1/2 的概率被选中,求区间交的长度平方的期房。

    要求区间交的长度平方的期望就是要求所有选择方案的区间交集长度的平方的和,将平方拆掉,即枚举每个小段算它的贡献,即这个小段的长度乘以这个小段被选中时所有方案的区间交长度的和,为了求这个东西相当于要再次枚举所有小段,每个小段的贡献就是它的长度乘以包含它的方案数,这个方案数为 (2^x-1)(-1) 可以先提出来,前面的部分用线段树维护区间乘法区间求和即可。

  • 相关阅读:
    CodeForces 519B A and B and Compilation Errors【模拟】
    ZOJ 3331 Process the Tasks 双塔Dp
    ZOJ 3326 An Awful Problem 模拟
    ZOJ 2968 Difference Game 【贪心 + 二分】
    ZOJ 3211 Dream City DP 01背包 经典问题
    ZOJ 2967 Colorful Rainbows 【Stack】
    ZOJ 3204 Connect them MST-Kruscal
    ZOJ 3203 Light Bulb
    面向对象程序设计-C++ Class & Object & Friend Function & Constructor & Destructor【第五次上课笔记】
    ZOJ 2852 Deck of Cards DP
  • 原文地址:https://www.cnblogs.com/mollnn/p/13911671.html
Copyright © 2011-2022 走看看