• 一些题(十五)


    [CF1672I] PermutationForces

    一个显然的贪心是每次选 \(c_i=|p_i-i|\) 最小的 \(i\) 删去,那么答案即为每次删去时 \(c_i\) 的最大值。删去 \(i\) 时会使满足 \((j<i\land p_j>p_i)\lor(j>i\land p_j<p_i)\)\(c_j\gets c_j-1\)。考虑模拟这个过程,如果用四分树,经过一些分析后,时间复杂度是 \(O(n\sqrt{n})\) 的,会 T。正解是分成 \(p_i>=i\)\(p_i<i\) 两侧分别考虑,每次只用考虑单调栈上的点,删去点时把在单调栈过程中被它弹掉的点加回去,而一侧对另一侧的贡献可以线段树维护。

    [CF1672G] Cross Xor

    考虑没有 ? 时如何判定,建一个二分图,左侧点是 \(u_1,\ldots u_n\),右侧点是 \(v_1\ldots v_m\),对于 \(a_{i,j}=1\),连边 \((u_i,v_j)\)。注意此时如果每个点的度数均为偶数就一定可行(对每条边操作一次)。否则如果对 \((i,j)\) 操作,会有几种情况:

    • \(n,m\) 均为偶数,\(u_i,v_j\) 的度数奇偶性不变,其余点反转,此时一定可行。
    • \(n,m\) 一奇一偶(不妨设 \(n\) 为偶),\(v_j\) 度数奇偶性不变,其余点反转,可行当且仅当所有 \(u\) 的度数奇偶性相同。
    • \(n,m\) 均为奇数,所有点度数奇偶性反转,可行当且仅当所有点度数相同。

    对于前两种情况,容易计数。对于第三种,可以考虑建一个新的二分图,对于在 \((i,j)\)? 连边 \((u_i,v_j)\),此时可对每个连通分量 \((V,E)\) 分别考虑,它的边张成了一个维数为 \(|V|-1\) 的线性空间,只用判断需要的状态(全 \(0\) 或全 \(1\))是否在这个线性空间里(等价于只判断初始状态和目标状态异或和是否相等),若不在则无解,否则会贡献 \(2^{|E|-|V|+1}\) 种方案。

    https://codeforces.com/contest/1672/submission/154784661

    [ARC139E] Wazir

    不妨设 \(H\le W\),然后分类讨论:

    • \(H,W\) 均为偶数,那么显然只有两种情况。
    • \(H\) 为奇数,那么最大值的上界为 \((H-1)W/2\),因为每一列至多选 \((H-1)/2\) 个格子。同时注意到每一列的选法有 \(H\) 种,如果两种选法能相邻就将它们连边的话会形成一个环。于是这个上界能取到当且仅当可以给每列分配一种方案使得相邻两列(循环意义下)的方案在环上相邻。由于 \(H\le W\),于是一定存在方案,且方案数为 \([x^0](x+x^{-1})^W\bmod (x^H-1)\),可以 \(O(H\log H\log W)\) 求出。
    • 否则,即 \(H\) 为偶数 \(W\) 为奇数,类似上一种情况,但因为不可能绕着 \(W\) 种行的方案形成的环走一圈,于是方案数为 \({H-1\choose H/2}\)

    https://atcoder.jp/contests/arc139/submissions/31251785

    [ARC139F] Many Xor Optimization Problems

    称一个线性基 \(\{Y_i\}_{i=1}^K\) 是标准的当且仅当:设 \(X_i\)\(Y_i\) 的最高位(主元),那么对所有 \(i\ne j\),满足 \(Y_i\) 的第 \(X_j\) 位为 \(0\)。那么一个集合有且仅有一个标准线性基。

    考虑计数,先钦定这个集合的标准线性基的主元为 \(X_1< \ldots < X_K\),那么这些集合的答案会有以下三部分组成:

    • 这种集合的个数;
    • 满足上述条件的线性基能表示出的最大值的期望;
    • 满足上述条件的线性基的个数。

    对于第一个部分,答案为 \(\prod_{i=0}^{K-1}(2^K-2^i)[x^{N-K}]\prod_{i=0}^K(1-2^ix)^{-1}\)。其中前面的为每次加入一个产生新的基元素的贡献;后面为不产生基的元素,其中 \(\prod\) 枚举的即为它是在产生完第几基之后被加入的。可以 \(O(n\log n)\) 求出每个 \(K\) 在这部分的贡献。

    对于第二部分,答案为 \((2^{X_K+1}-1+\sum_{i=1}^K 2^{X_i})/2\),因为除了 \(K\) 个主元一定是 \(1\) 之外,剩下的每个 \(<X_k\) 的位都有 \(1/2\) 的概率是 \(1\)

    对于第三部分,答案为 \(\prod_{i=1}^K 2^{X_i+1-i}\),这是因为在选取第 \(i\) 个主元对应的元素时,它的最高位只能是 \(X_i\),且剩下的位中已经有 \(i-1\) 个被钦定为 \(0\)

    接下来就是要对每个 \(K\),求形如 \(\sum_{X\subseteq \{0,\ldots,m-1\},|X|=K} ((\max_{i\in X} 2^{i+1}-1)+\sum_{i\in X} 2^i)\prod_{i\in X} 2^i\)。括号里的第一部分可以分治 NTT 在 \(O(M\log^2 M)\) 的时间内求出; 第二部分即为 \((2^M-1)c_K-(K+1)c_{K+1}\),其中 \(c_K=\sum_{X\subseteq \{0,\ldots,m-1\},|X|=K}\prod_{i\in X} 2^i\),这是因为可以把 \(\sum_{i\in X} 2^i\) 看作 \(2^M-1-\sum_{i\notin X}2^i\) 然后拆拆贡献。

    总时间复杂度 \(O(N\log N+M\log^2 M)\),不想写了。

    [XXI Open Cup, GP of Korea] B. Cactus Competition

    https://qoj.ac/submission/30498

    [Ptz Winter 2022. Day 2] H. Endless Road

    只考虑给定线段的端点,它们会把整条直线分成 \(O(n)\) 个段(称作单位段)。那么删除一个线段时可以依次删除它包含的每个未被删的单位段(可以用并查集找),在删单位段的过程中更新其他段的剩余长度。

    如果给定线段互不包含,将它们按左端点排序后,包含一个单位段的区间总是连续的,这个区间可以二分求出。于是可以用线段树对它们的剩余长度区间减,以及求最小值从而找到下一个被删的。

    然后发现如果一个线段包含另一个,那么被包含的那个一定会先被删。于是可以先考虑那些没有包含其它段的段(称作候选段),它们可以用上述方法维护。

    但还有个问题,在删除一个候选段后可能有新的段成为候选段。注意到候选段其实是按左端点排序后成为后缀右端点最小值的段,于是可以再用一颗线段树去动态维护。

    时间复杂度 \(O(n\log n)\)

    [SRM619] SimilarSequencesAnother

    这个条件相当于 \(\operatorname{LCS}(A,B)\ge n-2\),由于求 LCS 可以 dp 做,所以这道题可以考虑 dp 套 dp。

    注意到这个限制很紧,于是当外层 dp 做到 \(i\) 时,里层 dp 可只记录五个位置的值(\((i,i-2\sim i),(i-1\sim i-2,i)\)),且每个位置可以记录 LCS 于 \(i\) 的差(若合法则必须 \(\le 2\))。同时,为了转移,可以再记录两个串分别末二位的元素的相等关系。

    这样对于每个 \(i\) 记录的状态数是 \(O(1)\) 的,于是复杂度就是 \(O(n)\),这题 \(n\le 100\),记得状态的常数大点也随便跑。

    https://vjudge.net/solution/36283686

    [SRM502] TheCowDivOne

    大力单位根反演:

    \[[x^k]\sum_{n|i} [y^i] \prod_{0\le j<n}(1+y^jx)\\ ={[x^k]\over n} \sum_{0\le i<n}\prod_{0\le j<n}(1+\omega_n^{ij}x) \]

    然后发现固定 \(i\)\(\omega_n^{ij}\) 关于 \(0\le j<n\) 的只有 \(d=n/\gcd(i,n)\) 种取值,分别为 \(1,\omega_{d},\omega_{d}^{2},\ldots\),且每种取值均出现 \(n/d\) 次。于是考虑枚举 \(d\) 分别计算:

    \[={[x^k]\over n}\sum_{d|n}\varphi(d)\left(\prod_{0\le j<d}(1+\omega_d^jx)\right)^{n/d}\\ ={[x^k]\over n}\sum_{d|n}\varphi(d)(1+(-1)^{d+1}x^d)^{n/d}\\ ={[x^k]\over n}\sum_{d|n}\varphi(d)\sum_{0\le j\le n/d}{n/d\choose j}(-1)^{(d+1)j}x^{dj}\\ ={1\over n}\sum_{d|n,d|k} \varphi(d){n/d\choose k/d}(-1)^{(d+1)k/d} \]

    求答案和求 \(\varphi\) 都可以直接枚举约数算,时间复杂度大概是 \(O(n^{0.75}+kn^{0.5})\)

    [SRM635] ColourHolic

    只考虑出现次数分别为 \(a,b\) 的两种颜色,它们在最终序列中会形成若干个连续段,每个连续段只有三种可能:第一种颜色比第二种恰多一;第二种颜色比第一种恰多一;两种颜色一样多。

    如果钦定了连续段的数量 \(k\),那么可以只枚举第一种情况出现的段数,后两种就能直接算出,方案数也容易预处理出组合数后 \(O(1)\) 求出。于是总方案可以 \(O(k)\) 求出

    于是可以将出现次数较少的两种颜色分为一组,较多的分为一组。然后枚举每组在最终序列中形成的段数(至多 \(401\) 段,且两组段数相差至多 \(1\))并按上述做法计算方案即可。

    https://vjudge.net/solution/36267838

  • 相关阅读:
    算法与数据结构(二):排序
    冒泡排序
    责任型模式一:Observer(观察者)模式
    接口型模式(二)Bridge(桥接)模式
    内部排序:归并排序
    mean函数
    cross validation
    内存不足导致的java.lang.OutOfMemoryError: java heap space引出java工程启动参数设置
    angularjs 的hello world
    Nexus私库上传jar文件
  • 原文地址:https://www.cnblogs.com/Y25t/p/16259650.html
Copyright © 2020-2023  润新知