💡

逆天记录 - 1

创建于 2023-07-11

Tags: 好题

CF407E k-d-sequence

首先特判 d=0d=0 的情况。否则显然一个合法的区间所有数 modd\bmod d 都相等。

将这样的区间拉出来,一个个考察,显然可以将所有的数都 ÷d\div d,这样就变成了公差 =1=1 的等差数列。一个区间 [l,r][l,r] 合法,当且仅当:

  • [l,r][l,r] 中的数两两不同。

  • rl+1+kmaxaiminai(lir)r - l + 1 + k\ge \max{a_i} - \min{a_i} (l\le i\le r)

第一个容易处理,直接开一个 map 记录一下每个数最后出现的位置即可。

对于第二个限制,化简变为 r+kmaxaiminai+l1r + k\ge \max{a_i} - \min{a_i} + l - 1,开一个线段树维护右边这依托即可,修改 min\minmax\max 可以开两个单调栈,这是套路的。

所以每次要查询区间内第一个值 val\le val 的位置,采用线段树二分即可。复杂度 O(nlogn)O(n\log n)

CF587F Duff is Mad

暴力做法是建出 ACAM,每次询问时对于 s[l,r]s_{[l,r]},每个字符串在 ACAM 上的 endpos 的 fail 树的子树内点权全部 +1+1,然后查询 sks_k 在 ACAM 上的所有节点点权之和。

考虑对于 sk|s_k| 根号分治。

  • sk.|s_k|\le \sqrt.,那么显然可以将询问离线,差分贡献,每次查询时暴力在 ACAM 上跳。

  • sk>.|s_k|> \sqrt .,那么显然这样的串不超过 .\sqrt . 个,对于每个这样的串统一处理,算出 ACAM 上每个节点的点权 +1+1 会对答案产生多少的贡献。然后枚举每个串,用 Fenwick Tree 统计贡献,或者用值域分块平衡。

平衡后的复杂度 O(mqlogm)O(m\sqrt{q\log m}),如果用值域分块则是 O(mq)O(m\sqrt q)

CF1842H Tenzing and Random Real Numbers

我们将所有数 axa_x 按照 ax0.5|a_x-0.5| 的大小从小到大逐个确定。由于在 [0,1][0,1] 之间随机,所以随到相同的数的概率是 00

考虑状压 dp,设 fSf_S 表示 SS 集合中的数都已经确定的合法概率。

对于接下来确定的 xx,如果 SS 中存在一个 yy,满足:

  • ax+ay1a_x+a_y\le 1,那么显然 axa_x 只能 <0.5<0.5

  • ax+ay1a_x+a_y\ge 1,那么显然 axa_x 只能 >0.5>0.5

所以按照 SS 中的数与当前 xx 的关系来确定转移系数是 0/0.5/10/0.5/1

最后答案即为 f(2n1)/(n!)f(2^n-1)/(n!)。复杂度 O(2nn)O(2^nn)

ABC242Ex Random Painting

题目要求所有点都被覆盖的期望时间,设随机变量 tit_i 表示位置 ii 被覆盖的时间,则要求的是 E[max{ti}]\mathbb{E}[\max\{t_i\}]

一眼 min-max 容斥,摁推一下柿子:

E[maxiS{ti}]=TS(1)T+1E[miniT{ti}]\mathbb{E}[\max_{i\in S}\{t_i\}]=\sum_{T\subseteq S}(-1)^{|T|+1}\mathbb{E}[\min_{i\in T}\{t_i\}]

考虑 E[min{ti}]\mathbb{E}[\min\{t_i\}] 的意义,假设与 TT 这个几何中的点有交的线段数量为 xx,那么 E[min{ti}]=mx\mathbb{E}[\min\{t_i\}]=\frac{m}{x}

考虑 dp,假设 fi,jf_{i,j} 表示考察了 [1,i][1,i] 中的点,选了一些点作为子集 (ii 点必选),有 jj 条线段与这个子集无交的 (1)T+1(-1)^{|T|+1} 之和。

转移时,枚举 i,j,ki,j,k,分别表示当前装它与上一个选择的点,那么 (k,i)(k,i) 中的线段与选择的集合无交,设为 cnt(k,i)cnt(k,i),转移时只要:

fk,j×(1)fi,j+cnt(k,i)f_{k,j}\times (-1)\to f_{i,j+cnt(k,i)}

至于如何求 cntcnt,直接做一遍二位前缀和即可。做完 dp 后带回 min-max 容斥的柿子中计算即可。

时间复杂度 O(n2m)O(n^2m)

ABC241Ex Card Deck Score

nn 很小,bib_i 的限制显然可以容斥计算。所以可以忽略每个卡的个数限制。考虑用生成函数计算:

i=1nk0aikxk=i=1n11aix\prod_{i=1}^n\sum_{k\ge 0}a_i^k\cdot x^k=\prod_{i=1}^n\frac{1}{1-a_ix}

采用待定系数尝试算出每个 aia_i 的系数 cic_i

i=1n11aix=i=1nci1aix\prod_{i=1}^n\frac{1}{1-a_ix}=\sum_{i=1}^n\frac{c_i}{1-a_ix}

两遍同时乘上 (1aix)\prod(1-a_ix),得到:

i=1nciji(1ajx)=1\sum_{i=1}^n c_i\prod_{j\not=i}(1-a_jx)=1

对于每个 ii,将 ai1a_i^{-1} 带入柿子,得到:

ciji(1ajai1)=1c_i\prod_{j\not=i}(1-a_j\cdot a_i^{-1})=1

这样即可在 O(n2)O(n^2) 的复杂度内计算出每个 aia_i 的系数 cic_i

然后枚举不合法的卡片集合 SS,钦定这个集合中的卡片都超过限制。计算出 cnt=miS(bi+1)cnt=m-\sum_{i\in S}(b_i+1)。即可算出贡献:

(1)SiSaibi+1(i=1nciaicnt)(-1)^{|S|}\cdot\prod_{i\in S}a_i^{b_i+1}\cdot\left(\sum_{i=1}^n c_i\cdot a_i^{cnt}\right)

时间复杂度 O(n2+n2nlogP)O(n^2+n2^n\log P)

ABC237Ex Hakata

首先可以证明,对于一个字符串 SS,其本质不同的回文子串个数 n\le n

考虑每次在 SS 后面加入一个字符后,字符串长度为 nn,如果出现了 S[x,n]S_{[x,n]}S[y,n]S_{[y,n]} 两个回文串,那么可以推断出 Sne=Sx+e=Sy+e=Sn+xyeS_{n-e}=S_{x+e}=S_{y+e}=S_{n+x-y-e},所以 S[x,x+ny]S_{[x,x+n-y]} 也是回文串,与 S[y,n]S_{[y,n]} 相同,故 S[y,n]S_{[y,n]} 已经在之前出现过。矛盾。

故每次添加一个字符,最多只会产生一个本质不同的回文串,原命题得证。

考虑计算出所有的本质不同的回文子串,若 S1S_1S2S_2 的子串,那么我们连一条从 S2S_2S1S_1 的有向边,不难发现会构成一张 DAG。

题目要求的即使这张 DAG 的最长反链,由 Dilworth 定理,最长反链 == 最小链覆盖。

由于最小链覆盖的过程可以看成把一些链合并的过程,每个点可以选一个出边合并,选一个入边合并,我们希望链合并的次数尽可能多。

考虑构建一张二分图,每个 DAG 上的点拆成左右两个点,将一条 uvu\to v 的有向边转化为 uu 的左部点与 vv 的右部点之间的边,然后求二分图最大匹配。最小连覆盖 == 点数 - 最大匹配数。

时间复杂度看代码实现,大致为 O(n4)O(n^4)O(n3)O(n^3),瓶颈在于判断两个回文子串是否为包含关系,除这一点外可以做到 O(n2)O(n^2)

AGC006F Blackout

很妙的题啊!首先观察到这个题中的点和平面没有什么关系,直接把点转化成边,构成一幅有向图。原来的变换等价于若有边 uvu\to vvwv\to w,则连上边 wuw\to u

由于连上的是三元环,所以考虑将这张有向图进行三染色(为什么是三染色想了半天,感觉自己是纸张)。假设图能够成功进行三染色,且有颜色 121\to 2 的边,232\to 3 的边与 313\to 1 的边,那么同一个连通块内所有这样的颜色对的点对都能连上边。证明显然。

如果无法进行进行三染色,那么必然存在一条这三类边之外的边。假设存在同色间的边 xxx\to x,假设 y=x1y=x-1,那么原本存在 yxy\to x 的边,操作后存在 xyx\to y 的边。

现在有 xyx\to y 的边与 yxy\to x 的边(设 y=x+1y=x+1z=y+1z=y+1x=z+1x=z+1,均在 mod3\bmod 3 意义下)。那么可以通过以下操作:

  • xy,yxx\to y,y\to x 推出 xxx\to x
  • yx,xyy\to x,x\to y 推出 yyy\to y
  • zx,xxz\to x,x\to x 推出 xzx\to z
  • zx,xzz\to x,x\to z 推出 zzz\to z
  • yy,yzy\to y,y\to z 推出 zyz\to y

所以若三染色不成功,则任意两点之间都能到达。

需要注意的是,如果三染色成功,且只有两种颜色,则是单向边的二分图,并无法使左部点与右部点全部连边。

CF1437G Death DBMS

先把所有串建出 ACAM,然后给每个串的 endpos 在 fail 树上的子树内的点权与这个串的权值 checkmax。

每次询问时,沿着询问串向下走,将答案 checkmax。不难发现每个点的权值其实是它在 fail 树上所有祖先的字符串权值 max,那么这个值就是答案。

考虑维护方法,将 fail 树拍成 dfn 序,建出线段树,线段树每个节点维护一个 multiset,就可以支持区间加,区间删除,单点查询最大值。时间复杂度 O(nlog2n)O(n\log^2 n)

还有一种根号做法,串长的总和限制了,由于 i=1xi=O(x2)\sum_{i=1}^xi=O(x^2),所以串长只会有根号种。使用字符串哈希,每次询问时枚举串长计算即可。时间复杂度 O(nlen)O(n\sqrt{\sum len})

qoj 6504 Flower's Land 2

找一找能删玩的序列的性质,发现没有成果。

考虑用一种运算方式来表示抵消操作。显然这种运算需要有逆来使抵消后变成单位元,需要有结合律来表示抵消操作后的消失,需要不能有交换律来防止不合法的抵消。

一看,这不是矩阵乘法吗!考虑对三种数各自刻画一个 3×33\times 3 的矩阵。奇数位置为对应矩阵,偶数位置为对应矩阵的逆。直接用线段树维护区间操作 0,1,20,1,2 次操作后的矩阵乘积即可。

每次判断只需要判断当前区间矩阵的乘积是否为单位矩阵即可。

时间复杂度 O(k3nlogn)O(k^3n\log n),其中 k=3k=3。如果维护 2×22\times 2 的矩阵,好像根据什么 Ping-Pong Lemma 会出问题,具体的我也不会证呜呜呜。

CF618F Double Knapsack

不做 CF 的人,高考都有难了!

结论:不需要选子集,只需要选子区间就能保证一定有解。

证明:转化为选子区间后,把序列求一遍前缀和,原问题等价于给你两个单调递增的序列 a,ba,b,你需要找出 0l1<r1n0\le l_1< r_1\le n0l2<r2n0\le l_2< r_2\le n,满足 ar1al1=br2bl2a_{r_1}-a_{l_1}=b_{r_2}-b_{l_2}

不妨设 anbna_n\le b_n,那么对于每个 0in0\le i\le n,都存在至少一个 0jn0\le j\le n ,使得 bjaib_j\ge a_i。我们对于每个 aia_i 找出这样的最小的 jj。由于值域为 [1,n][1,n],因此最小的 jj 一定满足 0bjai<n0\le b_j-a_i< n

这样的差只有 nn 种,而这样的 (i,j)(i,j)n+1n+1 个,根据鸽笼原理,一定存在一对 ((i1,j1),(i2,j2))((i_1,j_1),(i_2,j_2)) 满足两个的差相等,那么原问题中要找的 l1,r1l_1,r_1l2,r2l_2,r_2 就随之找到了。

对于 an>bna_n>b_n 的同理。这样,仅用子区间就能找到一组答案。

对于每个位置二分找比它大的复杂度 O(nlogn)O(n\log n),当然你可以用双指针做到 O(n)O(n)

CF1656H Equal LCM Subsets

由于值域很大,无法直接算 lcm\operatorname{lcm},因此考虑对每一个质因数考虑。

ai=kpkα(ai,k)a_{i}=\prod_kp_k^{\alpha(a_i,k)},那么对于每一个 kkmaxiSAα(i,k)=maxiSBα(i,k)\max_{i\in S_A}\alpha(i,k)=\max_{i\in S_B}\alpha(i,k)。把 max\max 的等于转化为互相小于等于,然后推一推式子:

k,xSA,ySB,α(x,k)α(y,k)\forall k,\forall x\in S_A,\exists y\in S_B,\alpha(x,k)\le\alpha(y,k)\\

再把小于等于转化为等于:

k,xSA,ySB,α(x,k)min{α(x,k),α(y,k)}=0\forall k,\forall x\in S_A,\exists y\in S_B,\alpha(x,k)-\min\{\alpha(x,k),\alpha(y,k)\}=0

发现因数个数的 min\min 其实就是 gcd\gcd 运算,式子转化为:

k,xSA,ySB,α(xgcd(x,y),k)=0\forall k,\forall x\in S_A,\exists y\in S_B,\alpha(\frac{x}{\gcd(x,y)},k)=0

发现存在一个 yy 满足上式 =0=0,实际上就是对于所有 yy 他们的 gcd\gcd 的值 =0=0

k,xSA,α(gcdySB(xgcd(x,y)),k)=0\forall k,\forall x\in S_A,\alpha(\gcd_{y\in S_B}(\frac{x}{\gcd(x,y)}),k)=0

然后把所有的质因数放在一起考虑,每个都没有出现,就是 gcd=1\gcd=1

xSA,gcdySB(xgcd(x,y))=1\forall x\in S_A,\gcd_{y\in S_B}(\frac{x}{\gcd(x,y)})=1

对于每一个 SBS_B 中的元素同理,由:

xSB,gcdySA(xgcd(x,y))=1\forall x\in S_B,\gcd_{y\in S_A}(\frac{x}{\gcd(x,y)})=1

直接暴力删除不合法元素,需要删除 n+mn+m 次,每次遍历所有元素 n+mn+m 次,计算上述值的复杂度是 O(nlogV)O(n\log V)O(mlogV)O(m\log V) 的,复杂度是 O(n3logV)O(n^3\log V) 的,无法通过。

考虑优化,用 n+mn+m 棵线段树维护每个 SA,SBS_A,S_B 中元素的上述值即可,删除后对于每个另一个集合中的数,将他的位置设为 00。不难发现,这样单次计算上述值得复杂度是 O(1)O(1) 的,而每个元素至多删除一次,单次删除复杂度 O(nlognlogV)O(n\log n\log V)O(mlogmlogV)O(m\log m\log V)

n,mn,m 同阶,则最终复杂度 O(n2lognlogV)O(n^2\log n\log V)

CF878D Magic Breeding

虽然每个生物的特征很多,但不难发现,对于每一次询问,答案一定是对应特征中 kk 个值中的一个。

考虑每次询问时枚举这个答案,判断是否可行。我们将所有 x\ge x 的值标记为 11,不难发现本质不同的大小关系只有 2k2^k 种,用一个 bitset 维护一下这 2k2^k 种初始大小关系在变换结束后的结果是多少。

由于值域是 {0,1}\{0,1\},所以取 max\max 就是两个 bitset 取或,min\min 就是两个 bitset 取与。

最终复杂度 O(nklogk+qk+q2kω)O(nk\log k+qk+\frac{q2^k}{\omega})

CF1474F 1 2 3 4 ...

由于相邻两项的差都是 11,因此 LIS 是公差为 11 的等差数列。LIS 的长度很好求,直接枚举起点段和终点段即可,复杂度不高也不重要。难点在于计算 LIS 的个数。

LIS 的数的区间并不唯一,但是不难发现不同数的区间的 LIS 都不交。因此考虑将原序列的折线段分段,每段以下降段开始,以上升段结束,且能够取到最长 LIS 的长度,且 LIS 的值域唯一,且是能取到该值域 LIS 的最长区间。

对于每个区间内,可以考虑 dp 计算方案数。令 fi,jf_{i,j} 表示填到值为 ii 的数,目前位于第 jj 条折线的方案数。转移时,考虑上一个数所在的区间,但是直接转移复杂度爆炸。

发现值域被所有折线段的左右端点分成了 O(n)O(n) 各区间,每个区间中的转移方式是相同的,因此可以考虑使用矩阵快速幂来优化,这样就能快速转移了。

最终时间复杂度 O(n4logV)O(n^4\log V)。注意一些细节,比如所有数都是负数,特判也要取模等。

P9462 终点

钦定以 11 号点为根。首先询问出所有点到 11 号的中点,假设 11 号点的深度为 00,那么所有的连边都是从深度为 xx 的点连向深度为 2x2x 的点。

定义一个点的长度为一直向上走询问得到的“返祖边”走的距离。

找出所有点中长度最大的点,这个点的最终祖先一定是深度为 11 的节点。证明考虑如果这个点的祖先不是深度为 11 的,那么他的深度一定可以被表示为 c×2kc\times 2^k,而 cc 是奇数且 1\not=1。那么我们找一个深度 =c1=c-1 的节点,那个节点的深度就能被表示为 c12×2k+1\frac{c-1}{2}\times 2^{k+1},长度比那个点大,矛盾。

这样我们找到了深度为 11 的节点。然后询问所有深度为奇数的节点(就是前一次询问未得到答案的节点)与这个深度为 11 的节点的中点。通过这些询问我们可以类似 bfs 的得到所有点的深度。

接下来,考虑按照节点的深度从小到大依次确定父亲节点,从而确定这颗树的形态。

考察一个节点 uu 时,考虑定义函数 solve(rt,u)\operatorname{solve}(rt,u) 表示在 rtrt 为根的子树内寻找 uu 的父亲(保证 uurtrt 子树内)。分以下三种情况考虑:

  • deprt+1=depudep_{rt}+1=dep_u,那么 rtrt 即为 uu 的父亲节点。
  • depudeprt0(mod2)dep_u-dep_{rt}\equiv0\pmod 2,那么询问 uurtrt 的中点 vv,递归查找 solve(v,u)\operatorname{solve}(v,u)
  • depudeprt1(mod2)dep_u-dep_{rt}\equiv 1\pmod 2,那么随便找一个 uu 的儿子 ss,询问 ssuu 的中点 vv,递归查找 solve(v,u)\operatorname{solve}(v,u)

发现这样递归的深度上限是 logn\lceil\log n\rceil 的,但是长度很小,因为 nn 其实是 uudepdep

确定完每个节点的父亲节点后,树的形态就确定了。询问次数为 O(nlogn)O(n\log n),严格来说是 O(2n+ulogdepu)O(2n+\sum_u\log_{dep_u})

qoj 4193 Joined Sessions

考虑什么时候无解。如果当前最小支配集大小 =1=1 或所有线段不相交,那么无解,否则有解。

容易证明如果有解,那么至多三次合并就一定能使最小支配集的大小 1-1。证明随便画画就好了。

对于每个区间 ii,我们令 last(i)\operatorname{last}(i) 表示右端点在 lil_i 之前的右端点最大的线段,cont(i)\operatorname{cont}(i) 表示与 ii 相交的区间中左端点最小的区间。

容易发现,对于每次合并,一定是选择一个 xxcont(x)\operatorname{cont}(x) 合并。

由于至多三次合并就能使最小支配集大小 1-1,因此考虑 dp。

dp(j,s)dp(j,s) 表示对于前 jj 条线段,用了 ss 次合并操作,最小支配集的大小最小是多少。转移方程:

dp(j,s)=min{dp(last(j),s)+1,min{dp(contk(j),st)1ts}}dp(j,s)=\min\{dp(\operatorname{last}(j),s)+1,\min\{dp(\operatorname{cont}^k(j),s-t)|1\le t\le s\}\}

最后找出 dp(n,k)dp(n,k) 中第一个小于初始最小支配集大小的 kk,即为答案。

时间复杂度 O(nlogn)O(n\log n),瓶颈在排序。

Powered by Hexo, theme by Facter