跳转至

Petrozavodsk Camp, Summer 2021 MIPT Contest

排名 当场过题数 至今过题数 总题数
32/76 3 3 11

A

upsolved by 2sozx

题意

有两个 n×m 的矩阵,每个位置为 v,>,. 三种其中一个,每次可以向其中一个矩阵的左上角放一个 token ,然后顺着标志移动,v 向下移动, > 向右移动,当移动到 . 或者超出矩阵范围则停止。每次移动过后,路径上的标记会反转,即 v 变成 >> 变成 v ,问最少操作多少次能让两个矩阵完全一样。

q 次询问,每次会指定一个矩形的一个格子,将其标记反转,每次操作后要输出最少的操作次数,如果不存在输出 1n,m100,q105

题解

首先想要简化题意,即对矩阵进行一种赋值方式,对于每个位置 c 定义 Tc,Ac,Bc 分别代表在这个位置的 token,>,v 的值,定义一个矩阵的权值即为 P=c(HcAc+KcBc) ,其中 H,K 表示这个位置此时是否是 >v ,我们可以将所有 B 设为0,且显然对于我们权值的定义没有任何影响,因此我们只需要定义 TcAc

考虑一个 token 的移动,我们要使得每一步移动后整个矩阵的权值保持不变,因此可以根据这个想法得出一个表达式:

{Tx,y+Ax,y=Tx,y+1Tx,y=Ax,y+Tx+1,y

整理一下可以得到: {Tx,y=Tx,y+1+Tx+1,y2Ax,y=Tx,y+1Tx,y+12

因此如果我们知道了所有终态的 T ,则可以在 O(nm) 的复杂度内获得所有格子的 Tc,Ac ,并且我们可以在 mod1 的意义下进行这次操作,注意这里的 mod1 可以理解为值始终保持在 [0,1) 范围内,并且我们每次都是除以2,因此我们可以用二进制表示每个数。

下面证明一个引理:若 P1=P2 则两个矩阵完全相同。

考虑一个位置 Ac 以及在同一行右侧与其最近的终态点 c ,距离为 d ,权值为 Tc,则权值对于 Ac 的贡献为 12dTc ,并且显然对于其余的点,由这个权值 Tc 产生的贡献一定不会等于 12dTc ,即 d 不可能相同,因此 P1=P2 时两个矩阵完全相同。

PS:这里的证明感觉没有很严谨,我感觉可能和后方证明结合,应该是大概率相同。

我们还会发现一个很显然的定理,就是答案一定是一直向其中一个矩形放入 token ,正确性显然,并且放入 Ktoken 后矩阵的权值为 P+K×T0,0 。因此我们可以根据两个矩阵的权值 P1,P2 来计算得出所需的 token 个数,即 P1P2T0,0P2P1T0,0。显然这样会出现负数,考虑 T0,0 的分母最大为 2p ,显然 token 个数是在 mod2p 意义下的,因此可以除去负数的影响。

Δ=P1P2 ,另一个同理。发现 ΔT0,0 不好算,可以将 T0,02p 取类似逆元的东西,设为 Inv ,发现对于矩阵所有数均乘以 Inv 并不改变我们之前对于权值的定义,且乘后 T0,0=12p ,因此使用的 tokenK=ΔT0,0=Δ×2p

但是对于一个 Δ ,我们不知道他是否是一个可行解,因此我们考虑随机 r 次,在从终态 dp 的过程中随机向当前位的 Tc,Ac 增加 12 ,显然这样的随机一定是有一种可行的终态的。对于所有的随机结果 Ti,0,0 的分母最大值取 max ,得到一个 per ,如果存在一个随机状态的分母最大值不是 per ,让其继续随机即可。如果这时 Δ 全部相同,那么有 112r 的概率是正确的,因此可以直接计算。(分母 2per 的出现概率为 12

发现答案的数量级是 2n+m 左右,因此可以压位。

总复杂度为 O(nmrn+mGlogper+qrn+mG)

B

upsolved by 2sozx

题意

给定 k,nM=999k ,求第 n 个数 x 使得 x×M 不包含 9k18,n1018

题解

C

upsolved by

题意

题解

D

solved by JJLeo

题意

题解

E

upsolved by 2sozx

题意

n 个点 m 条边,每个点有三个参数 ci,si,ti ,假设当前权值为 x,对于一条边 (u,v) ,如果 xtv 则可以从 u 走到 v 并且 x=max(x,cv)。每个点开始 x=ci ,求对于每个点开始的所有路径的 maxsun,m2×105,ci,ti,si109

题解

ci,ti 可以先离散化。考虑将边进行分类,假设当前的值为 x

  • min(cu,cv)xmax(tu,tv) ,显然可以在 u,v 反复横跳,将这样的边作为双向边。
  • cuxmin(tu,cv1) ,则只可以从 uv ,将此定义为单向边。

考虑不考虑 x 时将所有边进行分类,然后对于 x 进行分治即可,对于双向边用可撤销并查集合并即可,分治时先递归右侧即可,这样才可以让单向边的答案更新正确。复杂度即为 O(nlog2n)

F

upsolved by

题意

题解

G

solved by JJLeo 2sozx Bazoka13

题意

题解

H

solved by 2sozx

题意

????

题解

????

I

upsolved by 2sozx JJLeo

题意

题解

J

upsolved by 2sozx

题意

给出 n 个分式,求两两相减后化成最简分数的分母的乘积。 n105

题解

nt 题,就考虑每个质数的贡献。

枚举质数 p ,考虑两个数相减 ab×picd×pj

  • 如果 ij ,这俩数对于答案的贡献就是 pmax(i,j)
  • 如果 i=j,对答案的贡献即为 pik=1i[a×b1=c×d1modpk]

然后直接算就行了,复杂度是个 O(20nlog2n) ,完全跑不满。

K

upsolved by 2sozx

题意

一颗 n 个节点的树, m 个叶子,树上有一个小偷,每次可以选择一条链,如果小偷在链上则被抓到,否则小偷可以往他所在的节点相邻节点移动或者不动。在初始不知道小偷位置的情况下,选择 m2+1 次能抓到小偷。给出方案。n105

题解

有以下两个非常显然的结论:

  • 每次选择一定是选择两个叶子最优。
  • 树中点度为 2 的点没有卵用,删了就行。
  • 选取一定要覆盖所有的边并且覆盖的顺序要有一定的要求。

考虑按照 dfs 给叶子进行编号。假定此时叶子数 m 为偶数。显然有一种简单的染色方式,即对于 i(0,1,m21) ,与 m1i 进行配对,显然能够覆盖到所有的叶子。

考虑转化一下上述选取方式,我们选取一个中心点 x ,每次覆盖 (xi,x+i1) 这两个叶子(模意义下),显然这种选取方式是上述选取方式的一个拓展。

考虑这种操作带来的问题。对于每条边会将整棵树分离成两颗子树。考虑其中一颗子树,如果此时子树大小为偶数,则对于这条边会存在一个 x 使得这条边最终没有被选到。会发现每条边最多会让两个点产生问题。

由于我们把点度为 2 的点全部都删掉了,因此可以证明树中剩余的边不超过 2m3 条,并且和叶子直接相连的边不会让任何点产生问题。因此最多有 m3 条边会让点出问题,根据抽屉原理,一定会有一个点 x 进行的覆盖至多让一条边没有被覆盖到,以这个点为中心覆盖即可。在覆盖的过程中,如果要跨过了最终没有被覆盖的边,强行覆盖一下这条边即可。

叶子数为奇数的时候,发现与上述情况本质相同,在选取 x 的时候,最后覆盖一下 x+m2 即可。

记录

0h:最后一场毛营,开局找签到,啥也没找到。看一堆人过了H,开始硬猜H结论。ZYF想D,想了个硬分块的 O(nnlog(n)) 的,看🐍他们过了H表示懵逼,完全不会(x,MJX猜了个垃圾结论,CSK写了暴力拍,发现MJX的算法完全寄了。MJX想了个K的算法,发现这个算法不知道从哪个叶子开始取,寄了。

1h:CSK看G,MJX ZYF看了看I,想了个处理方法,但是得 O(n3) 才能求出来,完全不会了。ZYF想了想,D用回滚莫队就不需要那个 log(n) 了,直接开冲。

2h:MJX和CSK讨论G,CSK把G的选取结论扔MJX,MJX想了想这题可以化成个直线取 max 的操作,套个模板就行了,ZYF过了D后喂给ZYF,ZYF直接开冲。MJX想H乱搞,乱搞了个方法写上去,发现样例能过(x

3h:ZYF过了G,MJX开始对拍H,发现拍不出来啥问题,不管了直接交了,过了(迷惑)。之后继续想I。

4h:不会,啥也不会。

5h:jgg讲了个I,发现和我们做法一模一样,但是由于我们求的是所有的和,不用把每个位置都求出来,因此可以少个 O(n) 的复杂度。🐂🍺。

总结

Dirt