Loading

省选集训day8

省队培训day8

考试

T1

一个 \(1\times n\) 的棋盘,每次给定 \(k,x\) ,求出满足黑格间距 \(\ge k\) ,且第 \(k\) 格为白色的方案数。对 \(998244353\) 取模。

\(1\le n,m \le 10^5,1\le k,x\le n\)

先不考虑对 \(x\) 的限制。令 \(f_i\) 表示 \(n=i\) 时的答案,有 \(f_{i}=f_{i-1}+f_{i-k}\)

对每一个 \(k\) 预处理,时间复杂度 \(o(nk+m)\)

或者我们考虑用组合数,限制其实可以转化为将黑格与前面的 k−1 个白格捆成一块,直接枚举黑格个数,算个组合数就好了。最前面的黑格子可能前面没有足够的白格,所以要在前面多加 k−1 个白格。时间复杂度 \(O(\frac {nm}{k})\)

那么我们对 \(k\) 进行根号分治。

那么对于这个 \(x\) 的限制,我们考虑用总方案减去强制这个位置为黑色的方案,这个题就做完了,复杂度为 \(O(n\sqrt m)\)

T2

给定一颗 \(n\) 个节点的 LCT ,最开始所有边都是虚边。
每个节点有权值 \(a_i\),每次按权值随机节点,将节点 access 并将权值 \(−1\),直到所有点权值均为 \(0\)

\(m\) 次修改,每次选定树边 \((u,v),a_u←a_u−1, a_v←a_v+1\)

对于开始时及每次修改后,求出所有实链长度为 \(k\) 次方和的期望。

观察到每条边最后是否为实边是独立的。
\(c_u\) 为u的子树内的 \(a_i\) 之和。
那么可以发现 \(u\) 的实儿子是 \(v\) 的概率是 \(\frac {c_v}{c_u}\)
考虑 dp,\(f_u\)\(i\)表示考虑以 \(u\) 为根的子树,不含 \(u\) 的实链的 \(k\) 次方+含 \(u\) 的实链的 \(i\) 次方和的期望。
不难写出转移。
单次询问时间复杂度 \(O(nk^2)\)

发现修改只会影响到一个 \(c_i\),所以使用动态 dp 就可以做到 \(O(k^3(n+m)log^1~2n)\) 的复杂度。
这就可以通过 \(k=1,2\) 的点了,当然不排除有其他更简单的做法的可能。

上面那个思路已经不太能优化了,所以考虑换一种思路。
考虑其实可以算出每条实链的出现概率,设这条链始于 \(u\) 止于 \(v\)\(u\) 的父亲为 \(fa\),那么概率就是 \((1-\tfrac{c_u}{c_{fa}})\tfrac{a_v}{c_u}\),对答案的贡献即为 \((1-\tfrac{c_u}{c_{fa}})\tfrac{a_v}{c_u}\times (d_v−d_u)^k\),其中 \(d_u\) 表示 \(u\) 的深度。
那么自然获得了一个 \(O(n^2m)\) 的做法,考虑如何优化。
由于 \(k\) 较小,可以考虑暴力将后面二项式展开,得到 \(k+1\) 项,分别维护。
注意到式子可以写成只与 \(u\) 有关的项和只与 \(v\) 有关的项的乘积,不妨分别记作 \(f_u,g_v\),那么 dfs 一遍,记录到根的路径上的 \(f_i\) 之和就可求得答案,时间复杂度 \(O(nmk)\)

一次修改只会造成 \(O(1)\)\(f_i,g_i\) 的更改,所以我们尝试用数据结构维护这个答案。
如果对每个 \(f\) 分别考虑,那么需要维护子树内的 \(g\) 之和,需要支持子树加,单点求值。
如果对每个 \(g\) 分别考虑,那么需要维护到根的链的 \(f\) 之和,需要支持单点加,链求和,自然可以转为子树加,单点求值。
这两者都可以使用树状数组维护。
所以我们先求出原先的答案,每次修改利用我们维护出来的东西计算答案的改变量。
时间复杂度 \(O(k(n+m)logn)\)

T3

\(n\) 个数,第 \(i\) 个数取值范围是 \([0,a_i]\)
\(m\) 次操作,单点修改,或查询区间 \([l,r]\) 中有多少种取值的情况使得异或和在 \([L,R]\) 中。
\(1≤n,m≤10^5\)\(0≤值域<2^{30}\)

暴力的想法应该是去对每个询问分别做,设 \(f_i,j\) 表示你现在在 \(i\) 这个位置,异或和为 \(j\) 的方案数,自然可以转移。时间复杂度 \(O(nmV^2)\)
如果数据随机,可以发现长度太大的询问很多时候都会碰到 \(a_i=63\),然后所有地方的值就相等了,于是只要统计一个区间积即可,长度小的询问就跑暴力。
数据不随机的话,考虑由于值域较小,可以直接利用树状数组统计出每个值出现的次数,预处理出每个值的 FWT 数组及对应的幂,询问直接乘起来做个 IFWT 就好。

考虑一类特殊的区间 \([c2^k,(c+1)2^k−1]\),下称 \(k\) -块。
性质:任意一个可重集异或上 \(k\) -块后,对于任意 \(i,j\) 满足\(⌊\frac i{2^k}⌋=⌊\frac j{2^k}⌋\),它们的出现次数都相等。特别地,对于两个块,它们异或后的结果还是块,大小等于原先较大的那个。
对于一个区间 \([0,a_i]\),可以将其分成若干个块,那么如果暴力考虑,就是每个位置挑一个块异或起来,再计算答案。
由于性质,我们可以直接枚举最大块大小 \(s\),再考虑计算方案数。
可以发现,每个位置要么选 \(s\) -块,要么选比其更小的块,而最终的值域的范围只会有一位不同。

那么暴力的想法是直接记录这一位为 \(1\) 还是为 \(0\),从左往右 dp,但实际上这就是一个一位的异或卷积,可以使用线段树维护。
注意我们只保证了 \(max≤s\),所以还要维护一下 \(max<s\) 的值来容斥。
时间复杂度 \(O((n+m)lognlogV)\)

杂题选讲

1P3647 [APIO2014]连珠线

给定一棵 \(n\) 个节点的树,边有边权。
你要从一个你选定的节点开始,以如下操作生成这棵树。
选择一个未加入的节点,将其与一个已加入的节点连一条红边。
选择一个未加入的节点,将两个当前有红边相连的节点的边断开,再让这个点与这两个点分别连一条蓝边。
最大化蓝边的权值和。
\(n≤2×10^5,权值≤10^4\)

先假设最开始选定的节点是 \(1\),树以 \(1\) 为根。
那么同时生成的两条蓝边一定是直上直下的,而且如果可以将最后的蓝边划分成若干个直上直下的长为 \(2\) 的链,也一定存在方案可以生成。
树形 dp,记 \(f_{u,0/1}\) 表示以 \(u\) 为根的子树中,\(u\) 点处是否还有一条未匹配的蓝边,不难转移。
但是开始的点不一定是 \(1\) 怎么办?
换根 dp,额外记 \(g_{u,0/1}\) 表示 \(u\) 以外的子树中,\(u\) 点到父亲的边是否是未匹配的蓝边,不难转移。

2 P6313 [eJOI2018]护照

\(n\) 场活动在 \(n\) 个不同的国家举行,需要 \(n\) 个不同的签证。
对于第 \(i\) 场活动,有开始日期 \(s_i\),持续时长 \(len_i\),签证时间 \(t_i\)。你将在第 \(s_i\) 天早上出发,第 \(s_i+len_i−1\) 天傍晚返回。你必须在出发前获得对应活动的签证。
你有 \(P\) 本护照用来申请签证。申请签证时当天中午必须没有任何活动,如果在第 \(d\) 天中午申请第 \(i\) 个活动的签证,你将在第 \(d+t_i\) 天中午获得带有签证的护照。注意收到时你可以在任意的国家。
请给出一种申请签证的方案,或输出无解。
\(1≤n≤22,1≤P≤2,1≤s_i,t_i,len_i≤10^9\)

先考虑 \(P=1\) 咋做。
如果我们知道每个活动签证的顺序,那么签证时间显然可以贪心得到。
于是我们可以状压 dp,设 \(f_S\) 表示已经 \(S\) 这个集合中的活动都签完证了,最后一次签证的结束时间最小是多少,转移直接枚举下一个要签证的活动,贪心的找到下一个合法的位置即可。
暴力实现是 \(O(n^22^n)\) 的,但是可以发现枚举下一个的时候按签证所需时长从小到大枚举即可做到 \(O(n2^n)\)
考虑 \(P=2\) 的时候,这两本护照其实是互不相干的,所以我们直接算出 dp 数组,然后枚举第一个护照签证的集合,看看是否合法即可。
输出方案可以再记一个辅助数组表示 dp 从哪里转移来。

3 loj6669 Nauuo and Binary Tree

交互题。
有一个 \(n\) 个节点的二叉树,以 \(1\) 为根。
最多可以询问 \(3×10^4\) 次某两点之间的距离,距离定义为它们之间的边数。
找出这棵树的形态。
\(1≤n≤3000\)

4 AGC043C Giant Graph

给定三张 \(n\) 个点的无向简单图 \(G_1,G_2,G_3\),边数分别为 \(m_1,m_2,m_3\)
构造一张有 \(n^3\) 个点的新图 \(H\),每个点形如 \((u_1,u_2,u_3)\),连边如下:
\((u_1,v_1)∈G_1\),则 \((u_1,u_2,u_3)\)\((v_1,u_2,u_3)\) 连边。
\((u_2,v_2)∈G_2\),则 \((u_1,u_2,u_3)\)\((u_1,v_2,u_3)\) 连边。
\((u_3,v_3)∈G_3\),则 \((u_1,u_2,u_3)\)\((u_1,u_2,v_3)\) 连边。
新图中点 \((u_1,u_2,u_3)\) 的点权为 \(10^{18(u_1+u_2+u_3)}\)
求这张图的独立集的点权和最大是多少。
\(2≤n≤10^5,1≤m_1,m_2,m_3≤10^5\)

暴力的想法是将点按照点权从大到小排序贪心选取。
考虑一个点被选当且仅当所有点权比它大的点且与它有连边的都没被选。
这其实等价于在 DAG 上有一个棋子,先后手轮流走,问是否必胜。
观察到三张图合成的方法其实正好对应公平组合博弈的加法,于是我们去算出这三张图每个点的 SG 值。
问题转化为求出所有三个点使得 SG 的异或和为 \(0\),对那个点权求和。
可以直接使用 FWT 求解。
注意到 SG 值至多是 \(O(\sqrt n)\) 级别,可以直接枚举。
复杂度 \(O(n+m)\)

5 CF1268D Invertation in Tournament

给定一张竞赛图。
你每次可以选择一个点反转与它相关的所有边,求最小的操作次数使得图强连通。
\(1≤n≤2000\)

结论:\(n>6\) 时答案只有 \(0,1\)
证明:考虑该图缩点后的图,一定形如一条链,不妨设有 \(k\) 个强连通分量。
\(k=1\) 结论显然,\(k>2\) 时可以发现任意选择一个中间的点都满足条件。
\(k=2\) 时,可以证明当某个强连通分量点数 \(>3\) 时结论成立,不妨设为入度为 \(0\) 的那个强连通分量。现在要证明这个强连通分量存在一个点使得反转它之后图依然强连通。
考虑归纳,\(n=4\) 时成立,当 \(n>4\) 时,必然存在一个点的入度与出度均 \(>1\),先删去这个点,根据归纳假设,现在有一个点反转后图依然强连通,然后再把刚刚删去的点加上,这时图依然强连通。
最后做法就是 \(n≤6\) 时暴力,\(n>6\) 时判一下强连通。

6 CF1268E Happy Cactus

给定一棵 \(n\) 个点 \(m\) 条边的仙人掌,边权为 \([1,m]\) 的一个排列。
对于顶点对 \((u,v)\),定义它是好的当且仅当存在一条 \(u\)\(v\) 的路径,使得路径上的边权单调增。
对于每个节点 \(u\),求出节点 \(v\) 的数量满足 \((u,v)\) 是好的。
\(1≤n,m≤5×10^5\)

如果是一棵树怎么做呢?
考虑边权最小的那条边,它只能在最开始经过,于是先删掉这条边,递归下去把方案数算完之后,让这条边连接的两个端点更新答案。
但是这个做法拓展到仙人掌上就会有一些问题。
问题在于更新答案的时候可能会有某个点在连边之前就已经能被两个端点达到了,但这个点最开始一定是环上最大的边在更新答案时被算进去的。且这个环需要满足从最小边到最大边的两条路径都是单增的。
于是我们预处理出这样的环,记录一下最大边更新时对应的答案,在最小边更新时减去重复的即可。
复杂度 \(O(mlogm)\)

7 CF1503E 2-Coloring

有一个 \(n×m\) 的棋盘,要将每个格子染成黄蓝两色。
一个染色方案是合法的当且仅当:
每一行都恰好有一个非空蓝色极长连续段。
每一列都恰好有一个非空黄色极长连续段。
求合法的染色方案数对 \(998244353\) 取模后的结果。
\(1≤n,m≤2021\)

首先考虑蓝色格子的连通性。
假如蓝色格子不连通,那必然存在一个位置 \(x\) ,使得第 \(x\) 行对应的区间与第 \(x+1\) 行对应的区间不交。
此时由于黄色格子的性质,我们发现第 \(x\) 行以上一定是上面的区间包含下面的区间,第 \(x+1\) 行以下一定是下面的区间包含上面的区间。
不妨假设第 \(x\) 行的区间在第 \(x+1\) 行的区间左边,我们考虑枚举 \(x\),再枚举第 \(x\) 行最右端的位置和第 \(x+1\) 行最左端的位置,方案可以利用轮廓线的特殊性用组合数算出来。
使用前缀和优化可以做到 \(O(nm)\)
如果蓝色格子是连通的,那黄色格子肯定不连通,转而去算黄色格子的方案数即可。

8 uoj37 主旋律

给定一张无重边无自环的有向图,问有多少删边方案使得剩下一张 \(n\) 个点的强连通图。
\(10^9+7\) 取模。
\(1≤n≤15\)

考虑强连通图不好处理,我们可以尝试算出不是强连通图的方案数。
考虑状压 dp,设 \(f_S\) 表示只考虑集合 \(S\) 中的点有多少种删边方式使得图不是强连通图的方案数,\(g_S\) 表示是强连通图的方案数,\(c(S,T)\) 表示集合 \(S,T\) 之间的边数,特别地,\(c(S)\) 表示集合 \(S\) 内部的边数。
计算不是强连通图的方案数可以将缩点后将所有入度为 \(0\) 的点剥掉,得到一个更小的连通块。
但是有一个问题在于我们必须钦定剩下的点入度都不为 \(0\),而这是很难做到的,所以我们考虑容斥。
对于一个剥掉 \(i\) 个点的方案,我们带一个 \((−1)^i−1\) 的系数,可以发现这样就是正确的了。
所以我们还要再设一个辅助数组 \(p_S\) 表示选择了若干个强连通分量带容斥系数的方案数。

转移有以下几个。
\(g_S=2^c(S)−f_S\)
\(f_S=(p_S−g_S)+\sum\limits_{\varnothing\not=T\subset S}p_T2{^c(T,S−T)+c(S−T)}\)
\(p_S=g_S−∑_{T⊂S ∧ minS∈T}g_Tp_{S−T}\)
实现时要小心转移顺序。
时间复杂度 \(O(3^n)\)\(O(n3^n)\)

9 uoj164 V

给定一个长为 \(n\) 的序列 \(a_i\),现在要执行 \(m\) 次如下操作:
区间 \([l,r]\) 执行 \(a_i←a_i+v\)
区间 \([l,r]\) 执行 \(a_i←\max(a_i−v,0)\)
区间 \([l,r]\) 执行 \(a_i←v\)
输出 \(a_x\) 的值。
输出 \(a_x\) 的历史最大值。
\(1≤n,m≤5×10^5,0≤a_i,v≤10^9\)

首先赋值操作可以变成减 \(+∞\),加 \(x\)
接着考虑如果我们把每个位置的操作序列全部保存了下来,那么对于一个位置它的值就相当于操作序列的后缀最大值,它的历史最大值就相当于操作序列的最大子段和。
容易发现信息是可加的,直接在线段树上打标记即可。
复杂度 \(O((n+m)logn)\)

10 P4429 [BJOI2018]染色

这个题没有讲。

11 uoj310 黎明前的巧克力

给定一个长为 \(n\) 的序列 \(a_i\),请求出选择两个集合 \(S,T\) 满足以下条件的方案数。
\(S,T∈{1,2,…,n}\)
\(S∩T=\varnothing,S∪T≠\varnothing\)
\(⊕_{s∈S}a_s= ⊕_{t∈T}a_t\)
\(998244353\) 取模。
\(1≤n≤10^6,0≤a_i≤10^6\)

考虑枚举 \(S∪T\),那条件转化为这个非空集合中的异或和为 \(0\),贡献是 \(2^{|S∪T|}\)
写成集合幂级数的形式为 \([x^\varnothing]∏_{i=1}^n\) \((2x^{a_i}+1)\)
自然考虑 FWT,变为 \([x^∅]IFWT(∏_{i=1}^nFWT(2x^{a_i}+1))\)
注意到内层的 FWT 的结果只会有 \(-1\)\(3\),考虑统计每个位置上 \(3\) 的个数,自然可以得到答案。
位置 \(s\)\(FWT(2x^{a_i}+1)\)\(3\) 当且仅当 \((−1)^{popcount(a_i\&s)} =1\),这正好对应了 \(FWT(x^a_i+1/2)\) 的值,但是这次的 \(n\)\(FWT\) 是相加而不是相乘,由于 \(FWT\) 是线性变换,我们可以直接全都加起来做一次 \(FWT\)
时间复杂度 \(O(VlogV+n)\)

12 loj3472 「JOI 2021 Final」地牢 3

有一个 \(n+1\) 层的地牢,地牢里有 \(m\) 个玩家。
玩家从第 \(i\) 层移动到第 \(i+1\) 层需要花费 \(a_i\) 能量,移动是单向的。
每层都有治疗泉,第 \(i\) 层的治疗泉可以花 \(b_i\) 金币获得 \(1\) 能量,可以多次使用,但不能超过玩家的最大能量。
每个玩家有三个参数,初始位置,终止位置,最大能量,玩家需要保证在任意时刻能量非负,问每个玩家需要花的最小金币数是多少,如果不能到达输出 \(-1\)
\(1≤n,m≤2×10^5\)

首先考虑 \(T=n+1\) 的情形。
暴力就考虑每次找到下一个比当前位置便宜的点,如果能到就加恰好的能量,否则加满。
考虑用扫描线维护这个过程,从右往左考虑。维护一棵线段树记录每个容量花的最少金币数。因为我们需要找到下一个比当前位置便宜的点,所以再维护一个单调栈。
每次扫到一个位置 \(x\) ,假设当前栈顶对应元素到 \(x\) 的距离为 \(L_1\),栈顶下面那个元素到 \(x\) 的距离为 \(L_2\),弹栈的时候就会让容量 \(U\) 大于距离 \(L_1\) 的金币数减少价值差 \(×(min(L_2,U)−L_1)\),原因是你在用位置 \(x\) 的价格去替换栈顶的价格。
\(x\) 加入栈中也会产生一个类似的贡献。

\(T≠n+1\) 怎么办?
考虑 \(S\)\(T\) 的路径上最后一次加油的位置 \(x\) ,这个位置应该是离 \(T\) 距离不超过 \(U\) ,且价格最小的位置。
可以发现在 \(S\)\(n+1\) 的路径上也会经过这个位置。
答案不难通过差分得到。
时间复杂度 \(O((n+m)logn)\)

13 AGC039F Min Product Sum

有一个 \(n×m\) 的网格,每个位置可以填 \([1,k]\) 的正整数。
对于每个格子,求出其所在行和所在列的 \(n+m−1\) 个数中的最小值,将所有的格子求出的值乘起来,定义为这个网格的值。
对于所有可能的 \(k^{nm}\) 种填数方案,将这个网格的值求和得到答案。
\(p\) 取模。
\(1≤n,m,k≤100,10^8≤p≤10^9\),保证 \(p\) 为质数。

首先那个乘积看上去就比较难搞,于是我们可以转化一下问题。
考虑把乘积再变成一个组合对象,也就是每个位置要填两个正整数,同时每行每列中第一个数的最小值要大于等于第二个数的最大值。
转而去枚举每行每列的最小值/最大值,经过一番尝试,我们发现枚举行最小值,列最大值是比较合适的。
从小到大确定,设 \(f_x,i,j\) 表示我们确定到了 \(x\) ,一共有 \(i\) 行,\(j\) 列在 \([1,x]\) 中的方案数。
转移时考虑值 \(=x\) 的行数和列数,算出被限制的数的方案数。暴力做是 \(O(n^5)\) 的。
注意到行和列在转移时是无关的,于是每次我们可以先转移行再转移列。
时间复杂度 \(O(n^4)\)

具体来说,我们用 a 代表枚举的行数,b 代表列数,那转移应该为
\(f_{x,i,j}=∑_{a=0}^i∑_{b=0}^j\binom{i}{a}\binom{j}{b}f_{x−1,i−a,j−b}⋅A(x,i−a,b)⋅B(x,j,a)\)
其中
\(A(x,i,b)=G(n−i,x)^b⋅(k−x+1)^{ib}\)
\(B(x,j,a)=G(m−j,k−x+1)^a\times x^{ja}\)
\(G(i,x)=x^i−(x−1)^i\)

14 CF1110G Tree-Tac-Toe

给定一颗 \(n\) 个点的树。开始时树上每个节点要么有一颗白子,要么为空。
黑白双方轮流下棋,白棋先下,每一步都选择一个为空的节点放上自己颜色的棋子。所有节点都有棋子时结束。
如果某个时刻存在一条长度为 \(3\) 的同色链,那么那个颜色对应的玩家获胜。如果结束时仍不存在则为平局。链的长度定义为点数。
判断胜负情况。
\(T\) 组数据,\(T≤5×10^4,∑n≤5×10^5\)

首先可以发现只有白棋赢或者平两种结果。
有白子的情况比较简单,只要白子所在点不是叶子或者它父亲的度 \(>2\) 白棋直接获胜。
如果有个点的度数 \(≥4\) 白棋获胜。
如果有个点的度数 \(=3\) 且它所连向的点至少有两个不是叶子,白棋获胜。
如果 \(n≤2\) 平局。
剩下的情况树只能长得几乎是一条链,除了两端可能有一个度为 \(3\) 的节点或者是一颗白子。
可以发现度为 \(3\) 的点就等效于在它的不为叶子的那边放了一颗白子,然后将这个点删去。
剩下的白棋可以赢的情况只有两端有棋子且点数为奇数。

posted @ 2021-06-06 21:07  hyl天梦  阅读(147)  评论(0编辑  收藏  举报