1.15~1.21 一周总结
考试-直接复制的联考经验和总结
1.16 BJ 联考
三道简单题,一个唐氏儿😅😅😅😓😓😓🐨🐨🐨
T1
\(n\le 60,H,W\le 10^9\)
显然二分答案。然后我以为这是 4-SAT 🤡
发现只要认为可以在端点相交,两个点如果相交,那么限制一定形如:这个点选择 \(a\) 形态,那个点一定选择 \(b\) 形态。
最后,看看每个点的四个选择是否有一个只有他自己在一个强连通分量(别的三个不和它一起),如果每个都是这样就满足条件。
上面可能是假的。
保证正确的:
拆成这样。考虑每一块小的,会有一些 2-sat 限制。那个类似于 4-sat 限制的东西可以被拆为: 14 必须有且仅有选一个,23 一样。
\(O(n^2\log V)\),常数极大。
T2
\(n\le 10^5,T\le 15\)。
就是比较排列的逆序对为奇数和偶数的方案数。发现求行列式即可。
发现答案为 \(0\) 或 \(1/-1\)。使用快速行列式,即考虑使用可并堆,每次把当前左端点最左的一堆点的右端点最小的拉出来,修改剩下点的右端点。这可以可并堆实现。可能涉及模拟交换行。并查集。
\(O(Tn\log n)\)。
T3
这里剩下的是区间剩下的。
就是任意长度为 \(k\) 的连续区间线性相关的序列个数。
考虑求存在 \(k\) 长连续区间线性无关的序列数。
首先发现 \(k>\lceil \log_2 m\rceil\) 的话任意 \(k\) 长度区间均线性相关。这样我们把 \(k\) 缩小到了 \(O(\log)\) 级别。
采用 dp,设 \(f(i,j)\) 为考虑到 \(i\) 位,\(j\) 是后缀极长线性无关子串长。
转移分两种。如果和上面的东西线性无关 \(f(i+1,j+1)+f(i,j)\times (m-2^j+1)\to f(i+1,j+1)\)。
否则枚举 \(l<j\),\(l\) 是新的数和 \(l\) 长后缀线性无关,\(l+1\) 就线性相关了。就是 \(f(i+1,l+1)+f(i,j)\times 2^l\to f(i+1,l+1)\)。
这一过程是线性变换,可以使用矩阵乘法优化 dp。
注意答案的统计。需要 \(\sum f(i,k)\times m^{n-i}\),把它认为是 \(m\) 为自变量的多项式,秦九韶算法即可把他搞成线性变换,压进矩阵乘法里。
时间复杂度 \(O(\log^3 m\log n)\)。
今天做题做的太小丑了。
1.17 Hez Difficult round
Difficult round。
T1T2 没看懂。
T1 是神秘构造,T2 是神迷题。
来看看可做题 T3。
\(n\le 5\times 10^5,q,V\le 10^5\)
发现就是 \(b_i=(i-1)(n-i)\),求 \(\sum b_is_i\) 最大,可以重排 \(s_i\)。
这个点积的形式不好维护,换个形式:
先给 \(b\) 从大到小排序。
设 \(d(i)=\sum_{j=1}^i b_j,c_i=\sum [s_j\ge i]\)。那么
发现询问等价于 \(c_i\) 区间加减。
不难发现 \(d\) 的奇数和偶数构成不同的三次函数。从而采取线段树维护序列 \(d(c_i)\),发现区间的 \(d(c_i+x)\) 是关于 \(x\) 的三次函数。维护区间 \(d(c_i+j),j\in[0,7]\cap \Z\),更新标记的时候插值更新即可。
\(O(q\log n)\)。
T1 看懂了,是神秘构造。
1.18 BJ 联考 🤡🤡🤡🤡🤡
三道题都被神秘做法艹了。只能说不会造数据可以不造😓😓😓
T1
一棵树,如果距离这个点 \(\le k\) 的点都被选了,那么可以获得 \(v_k\) 的收益。\(v\) 递增。选择点 \(u\) 有 \(w_u\) 的代价。
全选直接过了。不是很蹦得住。
设计 dp。基于至少一个点被选中(否则是 \(0\)),设 \(f(i,j)\) 为第 \(i\) 个点,其下面有 \(j\) 层都被选中,带来 \(v_u-w_u\) 的收益。转移要从 \(\forall v\in son(u),f(v,j)\),转移来,其中必须有 \(j\ge i-1\)。考虑对父亲的限制。\(f(fa_u,j)\) 必须满足 \(j\ge i-1\)。这个限制可以被转化为 \(i\le j+1\),那么可以转化为对(父亲)选儿子的限制:总的限制就是 \(\forall v\in son(u),f(v,j)\),有 \(i-1\le j\le i+1\)。
T2
\(n\le 10^6,p\le 2\times 10^5\)。
首先借助原根和离散对数变成加法。
这里可以利用 bitset 得到 \(O(\dfrac{p^2}w)\) 的做法,注意同一个值不改变背包状态的不要继续,才能保证复杂度。直接过了。
但是存在更优的做法。每次加 \(x\) 再 \(\bmod p\) 再连边会构成若干个环。所以 \(f((i-x)\bmod p)=1\) 且 \(f(i)=0\) 的数量等于 \(f((i-x)\bmod p)=0\) 且 \(f(i)=1\) 的数量。每次使用树状数组维护多项式哈希,再二分找到(这样的)不同的位置即可,均摊复杂度正确。\(O(n\log^2n)\)。
T3
\(n,m\le 2\times 10^5\).
使用知名的最大团算法可以达到 \(O(\sqrt m 1.63^{\sqrt m})\) 的复杂度,直接过了。
否则需要挖掘题目性质。考虑反图 \(E'\)(此时找独立集)。如果 \(a<b<c,(a,b),(b,c)\in E'\),则 \((a,c)\in E'\),这是显然的。那么这是“全序的图”。那么求最大独立集等于最长反链等于最小链覆盖,可以二分图匹配。
考虑优化匹配。把度数大的先暴力匹配,可以发现只剩下 $O(\sqrt m) $ 个;剩下的跑增广路算法,时间复杂度 \(O(n\sqrt m)\)。使用并查集维护当前弧。
1.20 2022 Jiangsu Collegiate Programming Contest
ABCD
A 模拟签到
B
将 \(1\sim n\) 分成若干个环,每个环相邻两个数的和是质数。环不能是二元的。
\(n\le 10^4\)。
一开始看错题了,以为一个环上可以出现多次一个数(跑个 dfs 树上欧拉序),没绷住。
然后考场上胡了个假的网络流,判不了二元环。然后就没想这道题(让 👻 去做,没做出来),去面馆等的时候借了个小朋友的笔三分钟胡出来了。
见数据范围知网络流。
怎么刻画环的性质:每个点,出度和入度都为一。据此,可以进行拆点,但是无法规避二元环。
考虑另外刻画环的方法。注意到相邻的是奇数和偶数,故环是偶长环。不妨把无向边变成有向边,钦定奇数指向偶数,那么环等价于奇数出度为 \(2\),入度为 \(0\);偶数反之。这样直接规避了二元环,因为二元环等价于重边。然后网络流建图跑最大流即可。注意二分图的最大流复杂度是 \(O(n\sqrt m)\),复杂度约为 \(O(n\sqrt{n\pi(n)})\)。
C
简单单调队列+调和级数复杂度 dp。
D
给定一个序列和一个数 \(n\),每次询问一个区间,问在区间中找若干对的距离为 \(n\) 的数的最大权值和。其中一对数必须两个不同。\(k<n\le 10^5\)。
首先观察到下标模 \(k\) 剩余系中不等价的东西互相没有影响。在下标模 \(k\) 意义下考虑即可。
显然 dp 可行,但时间复杂度太大。考虑优化 dp。看起来这玩意不能加速转移复合,考虑保存转移的状态;莫队刚好可以这么做到。
不删除回滚莫队。只需要考虑极左右的。设 \(f(i,j)\) 是左右 \(i,j\) 空出来的当前 dp 数组。转移 trival。
EFGH
E
给定 \(n,k\) 和长度为 \(n\) 的 \(a,b\) 两个序列,你可以将 \(a\) 重新排列,最小化:
\(1\le n\le 10^5,1\le a,b,k\le 10^9\)。
实际上就是把 \(b_i\) 一次减去 \(k\),保证比某个 \(a_i\) 小。
如果最大的 \(a_i\) 大于当前最大的 \(b_i\),就直接匹配。
否则需要把 \(b_i\leftarrow b_i-k\)。这个过程不会改变 \(b_i\bmod k\),数据结构维护即可。
F
有 \(n\) 种物品和一个容纳重量为 \(k\) 的背包,每种物品有价值 \(v\) 和重量 \(w\) 两种属性,无限个。
你可以购买至多 \(m\) 次,每次购买一个任意种物品,如果购买了 \(i\) 个,最后重量不能超过 \(k + i\).
一种方案的价值是物品价值之积,求所有方案价值之和 \(\bmod 998244353\).
$n, m, k ≤ 10^5
容易知道,一次操作的生成函数是 \(f(x)=\sum_{i}v_ix^{w_i}\),然后我们枚举购买了多少个物品。
对于 \(f(x)-x\) 的部分,如果常数项为 \(0\),我们可以平移求逆(本题保证不为 \(0\))。
G 神秘
IJKH
I 题诈骗题,特判一下即可。还真有人用 SA 的 h 数组过了。
J 题不知道题解在写啥,打表出来发现值非 \(0\) 的值集中在二的次幂周围,且一共只有不到 \(500\) 个,可以直接打表。
K 题简单构造,然后 🤖 降智严重,2h 才过。
L 题
长度为 \(n\) 的只含有 ABC 的字符串.
选择连续的三个位置 ABC,如果 A 在奇数位置就删去 AC,否则删去 B.
最大化操作数.\(1\le n\le 2\times 10^5\)
我们考虑把原串划分成当作 A……ABC……C 的字符串。
我们发现,删掉 AC 不改变后面的奇偶性,但是会改变这个 B 的奇偶性,所以我们要知道前面有多少个删掉的 B。
然后对于每一段只能删一次 B,而且删完之后这段 AC 就没用了,但是可以改变后面串的奇偶性。
对于能删 AC 或者 B 的,我们可以删 B,因为能使后面的奇偶性可以改变。
时间复杂度 \(O(n)\)。
学习
学了点分树板子和二次剩余。
过了旋转卡壳。
写题
补了 NOIP T3。
复习了计算几何,当时想着省选肯定要用,默写了几遍,反正目前没用。
做了两道计数(即使是多项式计数也有不少落后的啊!)。