跳转至

Petrozavodsk Camp, Summer 2021 IQ test

排名 当场过题数 至今过题数 总题数
46/90 5 12 13

B

upsolved by JJLeo

题意

数据结构,给定定值 k,w,维护序列 a1,a2,,an,有 m 次以下两种操作:

  • b1,b2,,bn 是将 a1,a2,,an 升序排序后的结果,输出 i=1nbiikw
  • 单点修改 ai

(1n1051k,w50ai105)

题解

i=1nbiikw=i=1nbiikbiikmodww

因此题目转化为分别维护 i=1nbiiki=1n(biikmodw)

注意到 ai 范围比较小 (当然很大也是可以离散化的),建立权值线段树,分别解决这两个问题:

  • 对于前者,权值线段树维护某个权值内所有的元素排序后的 ibiil,这里 l=0,1,,k

合并时右侧区间的元素排名会增大 x,这里 x 是左区间元素的个数,变为 ibi(i+x)l=ij=0l(lj)biijxlj=j=0l(lj)xlj(ibiij),预处理组合数和 0,1,2,,n0,1,2,,k 次幂即可 O(k2) 合并。

  • 对于后者,i=1n(biikmodw)=i=1n((bimodw)(imodw)kmodw),因此至多有 O(w2) 种不同的取值。

权值线段树维护某个权值内所有的元素排序后 bimodw=Aimodw=B 的元素数 cA,B

合并时右侧区间的元素排名会增大 x,这里 x 是左区间元素的个数,会对 B 产生一个 x 的偏移量,二重循环枚举可以 O(w2) 合并。

总时间复杂度为 O(m(k2+w2)logn)

C

upsolved by

题意

官方题解是三页论文。

题解

建议发表。

D

upsolved by JJLeo

题意

初始长度为 n 的序列 1,2,,nn 是偶数。每次可以选择两个相邻的数 i,j 删去,获得 ci,j 的权值,最小化所有获得权值的最大值。(2n4000)

题解

考虑一个 O(n3) 的区间 dp:

  • 如果 l,r 一起选,则有 max(fl+1,r1,cl,r)fl,r
  • 否则设 lk 一起选,那么 [l,k][k+1,r] 独立,因此有 max(fl,k,fk+1,r)fl,r
  • fl,r 对所有可能转移过来的可能取 min

可以发现 f 至多有 O(n2) 个不同的值,可以利用这一点来进行优化。从小到大依次遍历这 O(n2) 个值,将对应的 fl,r 赋为该值,设遍历到了 x

  • 如果 fl,r 已经被转移,max(fl,r,cl1,r+1)=x,且 fl1,r+1 还未被转移,则有 fl1,r+1=x
  • 如果 fl,rfr+1,k 都被转移,max(fl,r,fr+1,k)=x,且 fl,k 还未被转移,则有 fl,k=x
  • 如果 fl,rfk,l1 都被转移,max(fl,r,fk,l1)=x,且 fk,r 还未被转移,则有 fk,r=x

第一个转移可以 O(1) 完成,后两个转移如果直接遍历又变成了 O(n3) 了,可以考虑对每个位置维护两个 bitset LiRiLi,jRi,j 分别表示 [i,j][j,i] 是否已经被转移,对于第二个转移,对 Ll 的取反和 Lr+1 的交 B 不断使用 _Find_next() 找到下一个合法的 k 进行转移,对于第三个转移同理,这样总时间复杂度为 O(n3w)

E

solved by 2sozx Bazoka13 JJLeo

题意

交互题,给定一个 n 个点的无向连通图,每次可以问一个导出子图的边数,最多问 60 次,问原图是否有欧拉回路。(3n104)

题解

原图连通,只需判断每个点度数是否为偶。

先问出总边数,然后随机一个点集 A,问这个点集的边数,以及剩下点组成集合 B 的边数,总边数减去这两个边数之和即为 AB 之间的边数。

进行 29 次,如果有一次 AB 之间的边数是奇数,说明没有欧拉回路,否则有。

正确性证明:

首先如果 AB 之间的边数是奇数,显然从 A 出发不存在能回到 A 的回路。或者说,AB 之间的边数的奇偶性和 A 中所有点度数和的奇偶性相同,因此必然存在一个度数为奇的点。

假设有一个点 x 的度数为奇,在其它点确定被划分到 AB 时,这个点如果划分到 A 使得中间边数是偶数,则其划分到 B 就会让中间边数为奇,反之亦然。因此每次有 12 的概率错判,最终错判的概率是 1229,显然是可以接受的。

F

solved by 2sozx JJLeo

题意

给定质数 pq 组询问,每次问将 (a,b) 变为 (c,d) 最少需要多少次操作,或判断无解。一次操作是指:

  • (a,b) 变为 (2amodp,(b+pa)modp) 或者 ((a+pb)modp,2bmodp)

(2p109+71q105)

题解

容易发现 (a+b)modp 始终为定值,如果 c+da+b(modp),无解。

否则,设 A=(a+b)modp,下述所有运算均在模 p 意义下进行。

每次变化可以写为 (2a,2bA)(2aA,2b),因此进行 n 次操作后 a 可以变成 2naxA,其中 x[0,2n1],从而如果 c 可以被表示为 2naxA 的形式就可以 n 次操作变过去。注意 p 是质数因此存在逆元,这等价于 A1(2nac)=x,从而只需判 A1(2nac)modp 是否在 [0,2n1] 范围内,至多进行 O(logp) 次就一定可以,因此从小到大枚举 n 判定即可,总时间复杂度为 O(qlogp)

G

upsolved by JJLeo

题意

给定一个 n 个点的完全无向图,每条边被黑白染色,求恰好五条边同色的四阶完全子图的数量减去没有同色三角形的四阶完全子图的数量。(4n2000)

题解

超级 IQ test,太离谱了,大致写一下。

6 种本质不同的四阶完全子图,边颜色翻转后相同算一种。设它们的数量分别为 x1,x2,,x6,我们需要的是两种分别记为 x6x2,最后答案为 x6x2

计算四个量:

  • 四阶完全子图数量 (n4)
  • 四元点对 (A,B,C,D) 的数量,四个顶点不同,且 ABBC 颜色不同。这个可以枚举每个顶点枚举其两种颜色边的数量后 O(n2) 计算。
  • 四元点对 (A,B,C,D) 的数量,四个顶点不同,且 AB,BC,AD,DC,AC 颜色相同,相当于两个同色三角形共用一条边,对每个点预处理一个 bitset 之后枚举两个点将其 bitset 按位与起来求 1 的数量即可,复杂度为 O(n3w)
  • 四元点对 (A,B,C,D) 的数量,四个顶点不同,且 AB,BC,AD,DC 颜色相同,AC 和前面四条边颜色不同。相当于两个三角形共用一条边,共用的边和其它颜色不同,对每个点预处理一个 bitset 之后枚举两个点将其 bitset 按位与起来求 1 的数量即可,复杂度为 O(n3w)

上述四个值均是 x1,x2,,x6 线性组合式,将四个式子线性组合就能凑出 x6x2,好。

H

solved by 2sozx Bazoka13 JJLeo

题意

构造恰有 k 个无序点对 (u,v) 有哈密顿路径的无向图,要求 2n20。(1k60)

题解

对于 k=1,2,输出样例。

对于 3k20,输出一个环。

考虑一个完全图,随便选两个点再连出一个点,在此基础上,在这两个点之间不断增加点形成一条链,每增加一个点就能让点对数量增加 1

初始图为 n+2 个点,暴力打表出此时的点对数量 fn,则还能增加 18n 个点,那么 k[fn,fn+18n] 的方案就可以构造。分别取 n=5,6,7,8,9 可以发现其覆盖了 [21,60]

官方题解是是设链上增加了 m 个点,那么所有合法的 (n,m) 覆盖了 [21,60]

I

upsolved by JJLeo

题意

二维平面上一堆矩形,为简化题意保证对于两个不同的矩形,其顶点横纵坐标均不相同。

问有多少个矩形三元组,其互不相交。(1n2×105)

题解

考虑每个矩形代表一个点,两个矩形之间如果有交则连一条黑边,否则白边,那么需要求白色三角形的数量。如果我们能求出同色三角形的数量和黑色三角形的数量,就可以得到答案。

对于前者,黑白边完全图求同色三角形是经典问题,我们只需求出每个点有多少条黑边和白边,也就是每个矩形和多少个矩形相交:

首先需要维护一个数据结构,支持插入线段、删除线段、查询一条线段和多少条线段相交。

和线段 [li,ri] 不相交当且仅当 rj<lilj>ri,且如果 rj<li 必然不会 lj>ri,因此用两个树状数组维护 r 的前缀和和 l 的后缀和,用总线段数减去这两个即可。

接下来利用扫描线扩大到二维平面上,我们扫描 l,r 这个维度,在相关点在数据结构中加入/删除/查询 [di,ui] 这条线段。

对于左右边界为 [li,ri] 的矩形和多少矩形相交,首先计算 lj<li 的矩形,从小到大遍历,对于每个矩形在 li 处加入 [di,ui],在 ri 处删除 [di,ui],那么每个矩形在 li 处插入线段之前先查询一下 [di,ui] 与多少线段相交,即为 lj<li 与其相交的矩形个数。

接着再计算计算 lj>li 的矩形,还是从小到大遍历,对于每个矩形在 li 处加入 [di,ui],但不在 ri 处删除。每个矩形在 li 处加入后记录一下 [di,ui] 和多少线段相交,在 ri 处再查询一下 [di,ui] 和多少线段相交,增量即为 lj>li 与其相交的矩形个数。

对于后者,即为计算两两相交的矩形三元组:

还是需要解决一维上的问题,维护一个数据结构,支持加入线段、删除线段、以及计算有多少个两两相交的线段三元组。

考虑设 Ai 是有多少条线段覆盖了 i 这个点,Bi 是有多少条右端点不是 i 的线段覆盖了 i 这个点,(Ai3)(Bi3) 即为最右线段右端点为 i 的三元组数量,那么答案即为 i[(Ai3)(Bi3)]

接下来还是利用扫描线扩大到二维平面上,扫描 l,r 这个维度,在相关点在数据结构中加入/删除/查询 [di,ui] 这条线段。

从小到大依次遍历,对于每个矩形在 li 处加入 [di,ui],在 ri 处删除 [di,ui]。每个矩形加入时算一下加入后相比加入前增加了多少个三元组,答案即为对于每个矩形对该增量求和。

为什么这样不会算重?因为每个三元组恰好被 li 最大的那个矩形所计算到。

总时间复杂度为 O(nlogn)

J

upsolved by JJLeo

题意

对于两个排列 1n 的排列 pq,长度为 n01s ,如果存在一种方案将 1,2,,2n 填到一个 2×n 的矩阵 a 中,满足下述条件:

  • 每种数字恰好出现一次。
  • a1,i<a1,jpi<pj
  • a2,i<a2,jqi<qj
  • a1,i<a2,isi=0

那么就称 s 是合法的,定义 f(p,q) 为对于排列 pq 来说合法 01 串的数量。

现给定两个排列 1n 的排列 pq,其中 q 中有一些位置是不定的,求出对于每一种可能的 qf(p,q) 的和。

(1n100)

题解

可以发现列之间的顺序不影响答案,因此可以将每列按第一行的元素从小大排序,也就是将 p 排序成 1,2,,n,把 q 换到对应的位置。

引理:f([1,2,,n],q)q 中上升子序列的数量。

不妨让每个位置代表一个点,排列和字符串所产生的性质 u<v 则连有向边 uv,则 01 串合法当且仅当这个图无环,显然只在一行是不能有环的,因此如果有环那么也一定有这样的环:(1,i)(1,j)(2,j)(2,i)(1,i)

考虑 q 中最大的值 qi,如果 si=0 也即 i<qi,因为第二行没有再比 qi 大的数了,所以 (2,i) 没有任何出边,不会产生环,从而把这一列删掉不会有任何影响。

如果 si=1 也即 i>qi,那么对于 j>i 必然也有 j>qj,从而 sj=1。对于这些 ji(2,j) 也不会存在于一个环中,因为它们一旦做到 (1,j) 就只能继续往右走,而右侧所有点都没有出边。

因此每个串的构造过程可以抽象成两种操作:

  • 删掉一个最大的数。
  • 删掉一个最大的数和它右边所有数。

可以发现每次操作 2 等价于选一个数,且所有操作 2 选出来的数都是一个上升子序列,且操作序列不同根据上述分析得到的 s 也是不同的。

因此问题转化为一个排列中一些位置不定,求对于每一种可能的 q 的上升子序列的数量的和。

不妨设 q0=0,qn+1=n+1,同时 fi,j 是以 i 结尾有 j 个未知位置被选入上升子序列的方案数,设有 m 个位置是未知的,那么最终答案即为 i=0m(mi)!fn+1,i

al,r[l,r] 中的值有多少个没有出现,bl,r 为位置 [l,r] 中的空位数量,则有如下转移:

fi,j=I=0i1J=0min(aqI,qi,bI,i,j)(aqI,qiJ)(bI,iJ)fI,jJ

总时间复杂度为 O(n4)

K

upsolved by JJLeo

题意

t 组数据,构造 n 个元素的多重集,使得其恰有 k 个子集和为 0,要求 n30 且元素绝对值不超过 1016。(1t10001k106)

题解

考虑如果我们有一个多重集 S,其和不为 0,恰有 k 个子集和为 0。设其中正数的和为 P,负数的和为 N,不妨设 P>N,那么我们如果只往里面加是 P 倍数的数,不妨设新加的数组成的集合为 T,那么 ST 中和为 0 的子集数量即为 kx+y,其中 xT 中和为 0 的子集数,yT 中和为 P 的子集数。

子集中属于 S 的部分的和要么是 0 要么是 P,分别有 k 种方案和 1 种方案。

如果不是这样,那么其绝对值必然小于 P 且不为 0T 中元素均为 P 倍数,从而子集和模 P 永远不为 0,从而必然不是 0

预处理所有大小不超过 8 的元素来自 {3,2,1,1,2,3} 的多重集,并记录其和为 01 的子集数。

fi 为恰有 i 个子集和为 0 最少需要的多重集大小,P 是其正数的和,考虑选择上述预处理的一个集合 T 加入,设其和为 01 的子集数分别为 xy,将 T 中所有元素都乘以 P,那么 fi+|T| 就可以转移到 fix+y

可以发现这样对 i=1,2,,106 来说 fi 都不超过 30,只需记录转移过程即可输出方案。有可能加入集合时集合的元素之和为负了,这时将所有数取相反数即可。

一个细节是如果直接用所有预处理的多重集那么数量会过多,乘上一个 106 就 T 了。可以对 x,y 相同的取多重集大小更小的,这样转移就会减少很多,就卡过去了。

L

upsolved by JJLeo

题意

两个长度为 2n+1A,B,C,? 组成的字符串,可以将问号替换为这三种字母,问有多少种替换方式使得两者的最长公共子序列长度恰为 n。(1n106)

题解

考虑两个字符串的前两个字符,根据抽屉原理,四个字符必然由两个是相同的。再考虑接下来两个字符串的两个字符,重复 n 次这个过程,LCS 至少为 n

如果能观察到这一点,就可以猜想符合条件的字符串一定具有鲜明特点,且容易计数。

在比赛中如果发现了这一点,那么做法应该暴力打表找规律。可以发现只有以下两种情况 LCS 恰好是 n

  • 第一个字符串为 AB 交替,第二个字符串奇数位置都是 C,偶数位置是 AB
  • 两个字符串偶数位置都是 C,前 k 个奇数位置第一个字符串是 A 第二个字符串是 B,后 nk 个奇数位置第一个字符串是 B 第二个字符串是 A

这两种模式 ABC 当然是可以互换的。

考虑如何计数,一种方式是直接枚举 ABC 的全排列然后计数,但是这样会重,需要限制第二种模式 1<k<n,第一种模式如果第二个串偶数位置都是 A 只算 12 次 (因为它会算两次)。这样就不会重了。

当然题解给出了严谨证明,大致就是利用数学归纳法,删掉前两个或后两个字符就能得到一个已经归纳过的字符串对,对新增字符暴力分类讨论即可,这里略。

记录

0h:MJX 说 M 是签到,ZYF 懵了。懵了一会儿好像懂了,直接暴力过了。然后 MJX 看了看 A 想了下过了,开始和ZYF CSK 想F,逆十字7min过了,但是啥也想不出来,IQ--。

1h:然后卡到快俩小时,E 看错了题意没看到连通,完全是个新题,随机一发过了。ZYF开始想恒等式的解法,推了半天,发现是个恒等式。但是其实是对的,少开个 long long wa 了一发,然后过了。

2~5h:然后开始做梦构造H,开始CSK想了个构造的方法,但是好像覆盖不全,经过亿点点的推进,想到了先构造几个完全图,然后再连起来,去构造这60个数,感觉暴力跑不完就先考虑俩完全图连一起(?为啥不直接考虑一个?),暴力跑了一堆数据出来,发现差了点,最后想到好像一个完全图自己就最优了(?为什么最后才能想到,属于是构造题血脉压制了)。

总结

Dirt

回到页面顶部