补题round1
luogu P4233 射命丸文的笔记
如果一个竞赛图含有哈密顿回路,则称这张竞赛图为值得记录的。
从所有含有 n 个顶点(顶点互不相同)的,值得记录的竞赛图中等概率随机选取一个。
求选取的竞赛图中哈密顿回路数量的期望值。
性质1:有哈密尔顿回路等价于强连通。
性质2:竞赛图缩点是一条链状DAG,一个点向后继所有点连边。
一个竞赛图的所有哈密尔顿回路有\(2^{C(n,2)-n}*\frac{n!}{n}\)(枚举回路的n条边再枚举竞赛图其他边),所以这题只要求一下有都少个图满足条件,即有多少个强连通竞赛图。
也就是说有多少个竞赛图缩点后是一个点。
小小容斥一下。
\(f[i]=2^{C(i,2)}-\sum_{j=1}^{i-1}C(i,j)*f[j]*2^{C(i-j,2)}\)
AC还要优化到\(log^2n\),分治ntt,这题不写。
CF1498E Two Houses
n=500的竞赛图,给所有的入度,问最大的强连通点对的|du[i]-du[j]|最大是多少。交互询问x能否到y,输出Yes时必须结束程序输出答案,输出No可以继续问,所有度数互不相同。
可以用竞赛图性质:如果 x 的出度大于 y 的出度,则 x 可以到达 y。然后n^2拿出所有可能从大到小询问即可。
或者用更强的性质:(竞赛图强连通分量判定定理)将入度从小到大排序。这样极大scc在区间上连续,且右端点满足判定定理\sum=C(n,2)。
直接不用询问就能做完了。
CF1514E Baby Ehab's Hyper Apartment
交互题,有一张 \(n\ (n\le100)\) 个点的竞赛图。
询问1:可以询问 \(x\) 到 \(y\) 单向边方向,询问次数限制 \(9n\)。
询问2:可以询问 \(x\) 到 \(\{s_k\}\) 中有无 \(x\rightarrow s_k\) 方向的边,询问次数限制 \(2n\)。
现在需要查询竞赛图任意两点联通状态。
入度貌似不好的到,直接缩点。
先找到一条哈密尔顿路径。这个是单调的,可以二分,用9n次Query1.
再缩点,查询前缀区间是否有边,有就是和前面一个点在同一个强连通分量里面。
CF1779E Anya's Simultaneous Exhibition
IO 交互题。
有 \(n\) 个人下棋,他们两两之间对战的胜负是确定的,但你不知道。注意,胜负不具有传递性。
你可以进行至多 \(2n\) 次询问,询问形式为? i s
,其中 \(1\le i\le n\),\(s\) 是一个长度为 \(n\) 的 01 串,\(s_j=1\) 表示选择第 \(j\) 个人。系统会返回一个值 \(x\),表示若 \(i\) 与所有被选择的人对战胜利场数。
现在要进行 \(n-1\) 场淘汰赛,若你能安排每场比赛的对决双方,问哪些人最终可能留下。
竞赛图:缩点之后是一条链状dag,答案要求缩点后的入读为0的scc的大小。
先用n次求个度数,排序之后维护第一个scc的最后一个点在哪里,一共用2n次。
CF850D Tournament Construction
一个竞赛图的度数集合是由该竞赛图中每个点的出度所构成的集合。 现给定一个 m 个元素的集合,第 i 个元素是 ai。判断其是否是一个竞赛图的度数 集合,如果是,找到点数最小的满足条件的竞赛图,\(n,a[i]<=30\)
n最大是60,然后用兰道定理,dp找到n和du序列。
\(f[i][j][k]\)表示i个点\(\sum 出度 = j\)最大的出度为k的方案是否存在。
这样的构造是\(O(n^3)\)的,是兰道定理证明里面的一个。但也可以按照出度从小到大排序,\(O(n^{2}logn)\)
CF1497E2 Square-free division (hard version)
数组 \(a\) 由 \(n\) 个正整数构成。你需要将它们分割成最小数量的连续子段,使得每一个子段中的任意两个数(不同位置)的乘积不为完全平方数。
除此之外,你被允许在分割之前进行最多 \(k\) 次修改操作。
在一次修改操作中,你可以选择数组中的某个位置的数,将该位置的数变为任意正整数。
请问连续子段的最小数量是多少(在最多 \(k\) 次操作后)?
\(f[i][j]\)表示1到i用了j次机会的最少段数。
完全平方数就是所有的质因子指数为偶数。两数相乘为完全平方数即两数质因子质数%2之后相等。每段这种数字不能超过k个,预处理\(L[i][j]\),用了不超过j次机会右端点为i的最远左端点
这种题就是其实大题想法很容易想到,但不同的人写起来浪费的时间会相差很大。一开始脑袋短路没想预处理,想到了之后又想了个蠢蠢的错误做法。还wa了一发蠢蠢的错误。
CF1779F Xorcerer's Stones
给定一棵 \(n\) 个节点的树,第 \(i\) 个节点有非负权值 \(a_i\le 31\)。定义一次操作为:
选择一个节点 \(i\),\(1\le i\le n\)。
计算以 \(i\) 为根的子树(包括 \(i\) 本身)内的所有节点权值的异或和 \(x\)。
将以 \(i\) 为根的子树(包括 \(i\) 本身)内的所有节点权值赋值为 \(x\)。
已知这一操作最多可以执行 \(2n\) 次。Mars 想知道是否可以通过执行若干次这一操作使得树上所有节点权值均为 \(0\)。
如果可以,输出第一行一个非负整数 \(q\) 表示操作次数,第二行为 \(q\) 个正整数,表示每次操作选择的节点编号 \(i\);如果不可以,输出一行一个整数 \(-1\)。
你不需要最小化 \(q\),输出任意一组解即可。
\(f[u][x]\) 表示子树u是否可以凑出x。
发现性质:子树大小为奇数不会选择,因为选了之后异或和也不会改变,只会选择大小为偶数的子树,然后选了祖先关系的两个点会矛盾,所以不会选这种情况。然后dp转移就行了。
暴力转移需要做个背包\(O(n*32*32)\),方案其实也是有点麻烦(学到了不太会求)。
还有一种方法是dfs序dp,\(O(n*32)\)
具体是:如果第i个点要,就更新到f[i+siz[i]]否则就到f[i+1]。
但好像只快了一倍。
CF1768F Wonderful Jump
给定整数 \(n\) 和长度为 \(n\) 的序列 \(a\)。 从位置 \(i\) 跳到位置 \(j(1\leq i\leq j\leq n)\) 需要花费 \(\min(a_i,a_{i+1},\cdots,a_j)\times(j-i)^2\) 枚金币。 对于 \(k=1,2,\cdots,n\),求出从位置 \(1\) 经若干次跳跃后跳到位置 \(k\) 需要的最小金币总数。n<=4e5
决策和一步一步比较。会得到一个不等式。然后根号讨论。
具体的
\((r-l+1)^2\min_{i=l}^{r}a[i]<(r-l+1)*n\)
小于根号直接做,大于根号的部分,值域是根号的,min单调,再想想发现只需要看一段相同的最左端就ok。
确实很wonderful的一个题。做过一遍还是巴太行。
CF1783B Matrix of Differences
对于一个 \(n\times n\) 的矩阵,对于每一对相邻(有公共边)的值 \(a,b\),写下 \(|a-b|\)(即 \(a\) 与 \(b\) 差的绝对值)。定义这个矩阵的美丽度为写下的不同的值的个数。以如下的矩阵为例:
则所有相邻值的绝对值分别是 \(|1-3|=2,|1-4|=3,|3-2|=1,|4-2|=2\)。共有 \(1,2,3\) 三种不同的值,则这个矩阵的美丽度为 \(3\)。
给你 \(t\) 次询问,每次询问给定一个正整数 \(n\)。输出任意一个 \(n\times n\) 的矩阵,满足 \(1\sim n^2\) 在矩阵中各出现一遍,并且该矩阵的美丽度最大。
\(1\le t\le49,2\le n\le50\)。
把序列\(1,n^{2},2,n^{2}-1,3,n^{2}-2......\)塞进去
CF1783G Weighed Tree Radius
给你一个\(n\)个点的树和\(n-1\)条边。第\(i\)个点的初始权值为\(a_i\)。
定义结点\(v\)到结点\(u\)的距离\(d_v(u)\)等于\(v\)和\(u\)之间的边的数量。注意:\(d_v(u)=d_u(v),d_v(v)=0\)
定义结点\(v\)到结点\(u\)的权值距离\(w_v(u)=d_v(u)+a_u\)。注意:\(w_v(v)=a_v,w_v(u) \neq w_u(v)\)如果\(a_u \neq a_v\)
与通常的距离类似,让我们定义结点\(v\)的偏心距\(e(v)\)是从\(v\)到其他结点的最大权值距离(包括\(v\)本身),即\(e(v)=\max\limits_{1\leq u \leq n} w_v(u)\)。
最后,我们定义树的半径\(r\)是所有偏心距的最小值,即\(r=\min\limits_{1\leq v\leq n} e(v)\)
你需要对\(m\)次询问进行回答,对于第\(j\)次询问,给出两个数\(v_j\)和\(x_j\),表示将\(a_{v_j}\)的值修改为\(x_j\)。
在每次询问后,输出当前该树的半径\(r\)。
n<=2e5,m<=1e5
转为求直径,r=直径/2上取整。
然后用线段树动态维护树的直径,每个节点维护直径x,y即可,虚树即可,不用必然是两颗子树,直径依旧是四个点取两个,所以直接1到n建树维护。