校内比赛记录
2023.8.17
今天没有失误。
硬要说有的话主要是以下两点:
-
B 题一开始根本没想过写,还是最后才稍微写了一点一眼错的结论骗了一点。
-
对自己的 C 题太过于自信了,没有想过重新写一份 cdq 的,而是一直在卡常。
然后收获有以下两点:
-
发现 huffman 编码学得不好,之前做过的原题都一点没有印象。
-
在做偏序问题的时候考虑能否把有相同量的两个维度缩成一个。
2023.8.19
T1
做太久了,一直在卡常,还好最后卡过去了,但是导致 T2 时间不够,得不偿失。
T2
一开始就感觉到了边数很多,只需要找一条哈密顿路径应该是很好找的,后面打 \(n\le 10\) 的表的时候发现 \(n=50\) 都可以轻松跑过,但是没想过竟然可以直接搜索。
后面想到了构造一个长度为 \(k\) 的串只使用 \(|a_i-a_{i+1}|\) 使得只需要处理 \(n\bmod k\) 的,但是脑子抽了没想到后面可以直接爆搜,结果就是八种余数只构造出四种,导致 \(t=1\) 的分看脸,多测全挂。
T3
没怎么看,是最大的失误,但是也从侧面反映出前两天学的东西不扎实(cdq,整体二分)。
T4
没开,甚至没打暴力,全程突出一个摆烂二字。
补题
T1
余数是一个很典型的根号分治的模型。
-
对于 \(x\le \sqrt{Size}\),可以直接在修改的时候暴力维护,查询的时候直接输出。
-
对于 \(x> \sqrt{Size}\),注意到如果把每个数写成 \(ax+b\) 的形式,其实只有 \(\lfloor\frac{Size}{x}\rfloor\) 个 \(a\),相当于就是在每一段中查询最小的 \(b\),但是同一段的 \(a\) 是确定的,所以转化为查找前驱。
现在有两种选择:
-
类似于值域分块的做法,维护每一块的后继和每一个数在块内的后继,修改时是 \(O(\sqrt{Size})\) 的,查询是 \(O(1)\) 的。
-
sqrt tree,可以直接做到 \(\sqrt{Size}\) 修改,\(O(\log\log n/\log\log\log n/1)\) 查询。
T2
注意到边数其实非常非常多,而只需要找到一条路径,则如果有解一定很多。
写完爆搜会发现相邻两个数的差不会超过 \(7\),则直接爆搜非常快。
但是这不优雅,考虑使用同构串的方法做,比如长度为 8 的:1 6 3 8 5 2 7 4,就以这个为例。
讨论余数:
-
不用管,从 1 开始。
-
前面接上 1,从 2 开始。
-
前面接上 1 2,从 3 开始。
-
前面接上 1 2 3,从 4 开始。
-
前面接上 1 4 3 2,从 5 开始。
-
前面接上 1 4 3 2 5,从 6 开始。
-
前面接上 1 4 3 2 5 6,从 7 开始。
-
前面接上 1 4 7 2 3 6 5,从 8 开始。
T3
称 \(x_j\le x_i,y_j\le y_i\) 的两个点的关系为“\(i\) 覆盖 \(j\)”,发现点对 \((i,j)\) 产生贡献等价于 \(i\) 覆盖 \(j\) 且不存在满足 \(i\) 覆盖 \(k\) 且 \(k\) 覆盖 \(j\) 的点 \(k\)。
考虑排序的维度为 \(x\),而在 cdq 内部做的维度为 \(y\),用右边点当做右上的点,考虑存在所谓的 \(k\) 的情况:
-
两个左边点 \(k\) 覆盖 \(j\),则 \(j\) 废了。
-
一左一右 \(k\) 覆盖 \(j\)(\(k\) 在右)。
考虑对于第一种情况,\(y\) 维度已经满足了,所以在加入点 \(j\) 之前,只需要把前面所有 \(x_k<x_j\) 的点 \(k\) 弹出去即可,用一个堆维护即可,并且可以实时维护一个建立在 \(y\) 上的树状数组。
对于第二种情况,考虑在计算以 \(i\) 为右上点的贡献时有一个点 \(k\) 被 \(i\) 覆盖,则假如左边一个点 \(j\) 被 \(k\) 覆盖,那 \(j\) 就不能用了,注意到 \(j\) 和 \(k\) 一定有 \(x_j<x_k\),则只要 \(y_j<y_k\) 就不能用了,可以拿树状数组维护当前 \(x\) 坐标小于 \(x_i\) 的所有的右部点中的最大 \(y\) 值,不妨设这个值为 \(ymax\)。发现现在所有符合要求的左部点的数量相当于查询第一棵树状数组中 \((ymax,y_i]\) 的和。
总而言之这道题就以 \(O(n\log^2n)\) 的复杂度做完了(大概比单调栈好调,但是常数非常大)。
T4
因为全部为白点的做法和全部为黑点的做法完全相同,就只讨论全部变为白点的情况。
首先考虑在一条边上操作:从有边的两个点 \(u\rightarrow v\),再从 \(v\rightarrow u\),相当于对这两个点的颜色同时取反。
那么我们就能做两种东西了:
-
假如两个有边点颜色不同,可以把其中黑点移动到白点上。
-
假如是两个黑点,可以同时消除。
判断无解也比较简单了:
-
如果无奇环,则只需要判断黑点的数量的奇偶性即可。
-
如果有奇环,必定有解(在环上绕一圈就能把黑点的数量的值取反)。
然后基础的操作数是 \(2n\) 的(消除两个黑点需要两次操作),然后把黑点移动到一起的操作数也是 \(2n\) 的(移动一步需要两次操作,不走回头路把所有点聚在一起大概会遍历图上所有点一次),所以体感至少需要 \(4n\) 的操作。
但是在奇环上绕一圈也需要 \(n\),所以大约是一个 \(5n\) 的东西。
其实在奇环上绕的操作并不是特别需要,可以考虑在移动过程中绕,就是 \(4n\)。
但是我不会做。
2023.8.24
打了分组赛,做了很多基础 dp 题。
牡牛牝牛
设 \(f_i\) 表示有 \(i\) 头牛,最后一头为牡牛的方案数。
则 \(f_i=\sum\limits_{j+k<i}f_j\),用前缀和优化跑即可。
一模一样
考虑一个暴力的递推式子:\(f_{i,j}\) 表示消除第一行的前 \(i\) 各,第二行的前 \(j\) 个的方案数。发现可以这样递推:
-
\(f_{i,j}=\min(f_{i-1,j,f_{i,j-1}})+1,a_i=b_j\)
-
\(f_{i,j}=f_{i-1,j-1}+1,a_i\neq b_j\)
第二个式子可以简化为 \(f_{i,j}=f_{i-k,j-k}+k\),而 \(a_{i-k},b_{j-k}\) 是第一个前面的相等的位置。
清洁机器
考虑机器人的数量 \(k\) 很小只有 \(10\),可以得出一个 dp 状态:\(f_{u,x,y}\) 表示从 \(u\) 子树进入 \(x\) 个,清理完后出来 \(y\) 个的最小代价(假设这 \(x\) 个一开始就全部在 \(u\))。
然后就是一个简单的背包了,复杂度为 \(O(nk^4)\),跑不满,大概带个 \(\frac{1}{8}\) 的常数。
购买可乐
设 \(f_{i,j}\) 表示到第 \(i\) 个点,有 \(j\) 箱可乐的最小代价(不在第 \(i\) 个点购买),容易发现 \(f_{i,j}=\min\{f_{i-1,j-k}+(x_i-x_{i-1})j+C_{i-1}k\}\left(0\le k\le \min\left(F_{i-1},j\right)\right)\),于是就有了一个 \(O(nk^2)\) 的暴力东西,然而是可以单调队列优化的就 \(O(nk)\) 了。
树上染色
树上背包的板子题。
送披萨饼
考虑一个区间 dp 的做法,和关路灯那道题类似:\(f_{l,r,cnt,0/1}\) 表示 已经处理(包括送和不送)过 \(l\sim r\) 的客户,现在呆在 \(l/r\),还打算送 \(cnt\) 个客户的最大值(注意其实这里是倒推)。
最佳团体
首先有两条比较显然的处理方式:二分答案和分数规划。
假设当前有 \(ans=\frac{\sum p}{\sum s}\) 即 \((\sum s)ans=\sum p\),事实上现在相当于一个平均值,假如对于每个单个的人的性价比都是相等的,则 \(s_ians=p_i,ans=p_i/s_i\),现在套用刚才的二分答案,就定义一个数组 \(c_i=p_i/s_i-mid\),我们的判定条件为 \(\sum c_i>0\)。
加法游戏
考虑将两个人的操作看作一种,即一个人做了 \(2t\) 次操作。这样看的话,就是一个简单的 dp 了。
赛道修建
考虑首先二分这个长度,然后考虑如何让长度大于等于 \(mid\) 的链尽量多。
考虑一个点要么与它的两个儿子合为一条链,要么继承它的一个儿子传到父亲那里,显然如果放弃儿子一条能够自己贡献的链而传给父亲肯定是不优的,那么先用儿子贪心再跑出一条不影响儿子匹配数的最长链传给父亲。
木棍分割
首先考虑二分出这个最大的最小长度,这个的判定就贪心地一直接在当前段的后面,一旦大于 \(mid\) 了就立刻换下一段,正确性显然。
其次,当二分出长度之后,考虑设状态 \(f_{i,j}\) 表示前 \(i\) 根分成 \(j\) 段的答案,有 \(f_{i,j}=\sum f_{k,j-1}(sum_{k+1,i}\le len)\)。这个可以用单调队列优化。
2023.8.26
可以说最大的失误在于前面 \(1.5h\) 浪费在 T1 上,间接导致 T2 没有时间检查挂了 \(70\)。
幂次分数和
看看样例会发现求的方案数是组合。\(f_{i,j}\) 表示的是用 \(i\) 个数组成 \(j\) 的方案数,有 \(f_{i,j}=f_{i-1,j}+f_{i,2j}\),如果选择了 \(1\) 就是 \(f_{i-1,j}\),但是如果不选那么以后都不能选了(因为是组合),所以考虑给后面所有数都乘个 \(2\),就是 \(f_{i,2j}\)。
二叉索引树
\(cost(l,r)=calc(l-1,r)=sum1(l)+sum1(r)-sum1(premax(l,r))\)。
数位变化
不太会。
布置教室
对于任意一个班,先按照身高从小到大排序,发现一定是 \(1\) 和 \(2\) 一组,\(3\) 和 \(4\) 一组,\(2n-1\) 和 \(2n\) 一组。
考虑先把被另一种课桌区间包含的课桌去掉,然后排序就能满足当左端点单调的时候右端点也单调。
那么对于一种课桌的选择,我们对于任意的班级都会保持不变的安排顺序,即单调递增。
现在已经得到了单调性直接整体二分即可。
2023.9.2
边陲防务
首先考虑计算出距离每个点最近的关键点 \(f_u\),那么考虑求关键点 \(x\) 和关键点 \(y\) 的最短路上一定有两个有边相连的点满足 \(f_u\neq f_v\),所以考虑枚举每一条边,更新答案。
复杂度是 \(O(m\log n)\)。
路径异或
这种套路题一般都是统计一下从子树到根的各种链然后算一下非直链的贡献和直链的贡献。
但是直接弄不好做,发现操作是异或就二进制拆分。
2023.9.9
这一场没有什么好评价的,总之出的四道题只做了签到。
2023.9.18
独钓寒江雪
组队传球
注意到这个图保证是个仙人掌,那么就能够简单地把所有简单环找出来了,那么假设一个环上所有点的编号的最小值为 \(l\),最大值为 \(r\),那么对于区间 \([x,y]\) 不包含这个环的条件就是 \(l<x\) 且 \(y<r\)。
考虑类似于小丑的思路,假设 \(f_{i}\) 表示以 \(i\) 为右端点, 左端点最小能是多少使得 \([f_i,i]\) 是一个无环的区间,所以 \(f_i=\max\limits_{j} [i\le r_j](l_j+1)\)。
当得到了 \(f_i\) 之后,区间 \([x,i](f_i\le x)\) 就是合法的了,然后把询问离线下来就变成线段树模板题了。
2023.9.23
感觉自己的找规律构造图论学得都不是特别好。
异变
考虑最终的答案 \(ans_i\) 一定能表示成 \(a_{s_1}\text{xor}a_{s_2}\dots a_{s_k}\),那么先单独考虑 \(ans_n\):这个状态可以用一个 \(01\) 串表示,第 \(i\) 个位置为 \(1\) 表示最后 \(ans_n\) 要异或上 \(a_i\),那么表如下:

发现当 \(m=2^k\) 时有贡献的位置恰好为所有满足 \(n\bmod m=i\bmod m\) 的 \(a_i\)。
那么就能拆开 \(m\) 的二进制位然后跑了,复杂度 \(O(n\log m)\)。
充电桩
和这道题很像,依然考虑两个关键点之间路径可以通过枚举中间点构成,而中间点的最近关键点是一个多源最短路问题,可以用 dijkstra 解决,对于询问的加边可以直接离线下来并查集判。
2023.9.27
打的【】,主要是考试策略有问题,希望打线下赛不会出问题,引以为戒。
对称翻转
不妨设 \(ans_i=1/0\) 表示第 \(i\) 个位置可/不可行。
首先关于 \(i\) 的对称的位置是 \(2i-1\)。
分为两类:
-
\(2i-1> n\),则只要 \(S[i,n]=S[2i-n,i]\) 即可,判断回文半径。
-
\(2i-1\le n\),如果 \(s[1,2i-1]\) 不是回文,那么 \(ans_i=0\),否则 \(ans_i=ans_{2i-1}\)。
字符正方形
不妨用 \((x,y,l)\) 表示一个以 \((x,y)\) 为左上角边长为 \(l\) 的矩形,那么如果 \((x_1,y_1,l)\) 和 \((x_2,y_2,l)\) 是相同的,那么存在边长为 \(l\) 的矩形,然后考虑性质也一定存在 \(l-1\) 的矩形,所以答案具有二分性。比较两个矩形可以用哈希和 unordered_map 做到大常数的 \(O(n^2\log n)\)。
子段评分
常见的套路是对于每一个 \(i\) 去寻找 \(a_i\) 作为次大值所对应的区间,不妨设 \(l_{1/2}\) 表示 \(i\) 左边第一/二个 比 \(a_i\) 大的数的位置,\(r_{1/2}\) 同理,那么 \(i\) 对应的次大区间为 \([l_2+1,r_1-1]\cup [l_1+1,r_2-1]\),关于区间异或最大值可以用可持久化 trie 维护(注意数组开大一点)。
最佳表現
推论 1:对于 \(S[1,i]\) 如果满足 \(i-ne_i|i\) 则有最小循环节长度为 \(i-ne_i\)。
首先根据 \(ne\) 定义有 \(S[1,ne_i]=S[i-ne_i+1,i]\)。令 \(len=i-ne_i\),则有 \(S[1,len]=S[len+1,2len]=S[len+2,3len]\dots\),所以是循环节。
推论 2:一个串的全场最佳的元素个数只能是 \(1,2,n\)。
考虑这个串的最小循环节一定是“好”串,若循环节长度为 \(n\) 那么答案很显然为 \(1\),若循环节长度为 \(1\) 那么答案只能为 \(n\),而其它情况下可以构造一种方案 \(S=S[1,1]+S[2,n]\) 我们只需要考虑 \(S[2,n]\) 的性质即可,而这个串可以写成 \(s^k-s_1\)(\(k\ge 2\))。
则有 \(ne_{kl-1}=(k-1)l-1\),所以如果有循环节则长度为 \(l\),但是我们又知道这个串长度为 \(kl-1\) 所以它的循环节就是它本身,即这个串是“好”串。
有了这两个推论,就可以直接做了。
构造数列
首先考虑一个简单版的问题:\(m=2^k-1\),即每一位的 \(01\) 可以随便选,那么这道题就可以按照每一位计算了,类似于区间 dp,对于一段区间一定是前面一段填 \(0\),后面一段填 \(1\)。
然后考虑 \(m\) 为任意数的情况无非就是 \(01\) 的填法受到了限制,考虑类似数位 dp 那样在状态里面加上一个 \(limit\),时间复杂度为 \(O(n^3\log m)\),注意 cache 不要写大了。
事实上,这个区间 dp 应该是有四边形不等式的。
2023.10.1
这一场很多数学题,做其中一道的时候降智了(
数中有学
引理:\(\gcd(a^x-1,a^y-1)=a^{\gcd(x,y)}-1\)
证明如下:
不妨假设 \(x>y\),则有 \(\gcd(a^x-1,a^y-1)=\gcd(a^ya^{x-y}-1,a^y-1)\),又有 \(\gcd(x,x-1)=1\),则 \(\gcd(a^ya^{x-y}-1,a^y-1)=\gcd(a^{x-y}-1,a^{y}-1)\)。
这个形式和辗转相减是相同的,所以有 \(\gcd(a^x-1,a^y-1)=a^{\gcd(x,y)}-1\)。
集中解决 \(f\) 函数:
两层整除分块套在一起的时间复杂度为 \(O(n^{\frac{3}{4}})\),所以总时间复杂度为 \(O(Tn^{\frac{3}{4}})\),大概是 \(10^7\)。
遥色点对
考虑所有路径的每条边的最大值的最小值其实是一个很经典的模型,直接考虑建重构树,然后问题就变成了统计每一个非叶子节点的答案数,考虑直接枚举轻儿子的所有点,就变成了二维数点的板子。由于轻边的条数是 \(\log\) 的,所以询问数是跑不满的 \(n\log n\),所以总时间复杂度为 \(O(n\log^2 n)\)。
2023.10.3
[20230103]糖果销售(生成树+树形DP)
是一道很典但是很妙的题了,之前做过但是现在还是感觉很妙。
考虑令 \(C_i=\max(A_i-B_i,0)\),由题只需要满足在 \(i\) 的任意时刻糖果数都大于等于 \(C_i\) 即可。
首先有一个贪心的想法:如果从点 \(u\) 出发到点 \(v\),那么需要的钱的限制为所有路线的每一个点的 \(C\) 的最大值的最小值,看着就是重构树,但是其实可以直接用生成树做,反正是一样的。
考虑把每条边 \((u,v)\) 的边权设为 \(\max(C_u,C_v)\),在跑出最小生成树的每一条边后把这条边上 \(C\) 大的当做父亲,这样就得到了一些性质:
-
关于 \(C\) 的大根堆性质
-
所有可能的最优移动路径都在树上。
-
如果在树上走一定先考虑走完自己的子树再往外走更优,简而言之就是可以每棵子树单独考虑。
设走完子树 \(u\) 需要的最小代价为 \(f_u\),则答案为 \(f_{root}\),由于并没有要求从哪棵子树作为结尾,所以决策就是选择在哪棵子树收尾。方便起见,设 \(sb_u\) 表示这棵子树的 \(u\) 之和。
收尾的那个儿子其实非常特殊,不妨设它为 \(v\),那么针对其他儿子的子树,我们弄完之后还需要回到 \(u\),需要满足 \(C_u\) 的限制。又因为我们的性质 1,则可以得到一个结论:只要我们一开始先在 \(f_u\) 上加上一个 \(u\),那么除了 \(v\) 以外的儿子的子树就畅通无阻了,并且这样一定是花费最少的。
所以粗略想法是 \(f_u=sb_u+C_u\),但是发现比答案大,所以考虑这个特殊的点 \(v\) 到底有什么用。其实不需要加上 \(sb_v\) 的贡献,因为我们之前用来当通行证的 \(C_u\) 还没有发挥它的全部用处,所以有 \(f_u=(sb_u-sb_v)+\max(f_v,C_u)\)。
2023.10.4
[20231004]欧拉回路(打表+数学+图论)
结论:所有点的度数为偶数和这个图存在欧拉回路是可以互推的。
前 \(n-1\) 个点任意连边的方案数为 \(2^{C_{n-1}^{2}}\),单独考虑最后一个点 \(n\)。
显然前面的方案肯定不是都合法的,假设对于其中一种方案剩下了 \(x\) 个度数为奇数点,显然 \(x\) 一定是偶数。那么第 \(n\) 个点就必须对这 \(x\) 个点分别连一条边使得它们度数为偶,并且由于没有重边自环,所以点 \(n\) 不能向其它任意点连边,换句话说就是使得这个方案正确的点 \(n\) 的连边方案一定存在且唯一,所以方案数和 \(n-1\) 个点任意连边是相等的。
所以答案为 \(2^{C_{n-1}^{2}}\)。
[20231004]恢复(贪心+并查集)
不妨考虑一个弱化版的问题:没有 \(f\) 的限制该怎么做。
考虑决定两个点 \(x,y\) 的先后关系:
- 若 \(x\) 在 \(y\) 前,则贡献为 \(b_xa_y\)。
- 若 \(y\) 在 \(x\) 前,则贡献为 \(b_ya_x\)。
那么想让 \(x\) 排在 \(y\) 前则必须满足 \(b_xa_y>b_ya_x\),即 \(\frac{b_x}{a_x}>\frac{b_y}{a_y}\)。
所以直接按照 \(\frac{b}{a}\) 排序即可。
现在考虑加上 \(f\) 限制如何做:
依然考虑刚才的做法,把所有点丢进按照 \(\frac{b}{a}\) 比较的大根堆。拿出堆顶 \(u\),那么肯定希望让 \(u\) 在越前面越好,可惜 \(f_u\) 必须在 \(u\) 的前面,那么不妨把 \(f_u\) 和 \(u\) 缩成一个大点,大点的 \(a,b\) 就是 \(a,b\) 之和,然后加上贡献 \(b_{f_u}a_u\),最后把大点再加进堆里面,维护合并可以用并查集。
[20231004]采油(拓扑排序+线段树)
不妨设 \(s_u,t_u\) 分别表示以 \(u\) 作为路径的起点的最长路和以 \(u\) 作为终点的最长路。
拿到手没什么思路,考虑直接枚举删掉每一个点 \(u\)。
考虑删掉一个点 \(u\) 之后少了长度为 \(t_x+1+s_u\)(存在 \(x\rightarrow u\) 的边)和长度为 \(t_u+1+s_x\)(存在 \(u\rightarrow x\) 的边)的路径。
但是这样完全统计不了删掉之后的答案,原因在于边数太多了,且不能利用之间的信息。如果按照拓扑序枚举就有性质了(拓扑序把整个点集分成了两部分:比 \(tp_u\) 小的和比 \(tp_u\) 大的,而计算拓扑序为 \(tp_u+1\) 这个点的时候相当于只是点 \(u\) 所属的集合改变了)。计算长度时用可删堆维护即可。

[20231004]全矩形覆盖(随机染色)
关键性质:\(x,y\) 坐标的计算是独立的,换句话说,计算关于 \(x\) 的答案 \(ansx\) 和关于 \(y\) 的答案 \(ansy\),则有 \(ans=ansx\times ansy\)。
那么就等价于解决一个一维的问题了:在数轴 \([0,len]\) 上有 \(n\) 条线段 \([l_i,r_i]\),可以选择覆盖 \([l_i,r_i]\) 或者 \([0,l]\cup[r,len]\),求出被所有 \(n\) 条线段都覆盖的最大长度。
考虑一种基于随机化的哈希做法:一共 \(2n\) 个点把整根数轴分割许多条线段,对于某一些线段是可以在同一种方案下被算进贡献的,并且不存在如同“选了线段 \([l_1,r_1]\) 就不能选线段 \([l_2,r_2]\)”之类的限制。
所以考虑对于这 \(2n\) 个点随机赋权且保证 \(l_i\) 和 \(r_i\) 的权值相同,从左到右扫一遍,枚举到线段 \([l,r]\) 的时候,这条线段的权值为前面所有 \(p\le l\) 的点 \(p\) 的权值的异或值,拿个 map 统计一下即可。
选择异或是因为当跳出这条线段之后左右端点一异或就为 \(0\) 了,能起到很好的效果。
正确率挺高。
[20231004]树填数(树拓扑序+换根dp)
有根树拓扑序数量:\(\frac{n!}{\prod Size}\)。
感性理解:只要对于每一棵子树都有根是最小值那么就是一种合法方案了。那么考虑点 \(u\) 的拓扑序在子树中有可能是 \(rank1\sim Size_u\),所以方案数需要除以一个 \(Size_u\)。
2023.10.6
垫底了。
[20231006]决胜
获胜条件等价于不存在任意一种限制使得所有排列中逆序对数为奇数的排列数量和逆序对数为偶数的排列数量不等。
考虑有两个区间 \([l,r_1]\) 和 \([l,r_2]\)(\(r_1\le r_2\)),不妨把设第一个区间选择的数设为 \(a\in [l,r_1]\),第二个区间设为 \(b\in [l,r_2]\)。考虑 \(a\in [l,r_1],b\in [l,r_1]\) 的情况:考虑在这种情况下对于任意一个排列,逆序对个数在模 \(2\) 意义下为 \(x\),\(a\) 的取值为 \(a_0\),\(b\) 的取值为 \(b_0\),则一定有另一个排列的逆序对数为 \(1-x\)(不改变除了 \(a_0\) 和 \(b_0\) 以外的元素的值,而把 \(a_0b_0\) 交换,即可得到这个排列)。换句话说,逆序对数为奇数的排列和逆序对数为偶数的排列是一一对应的,可以抵消。所以第二个区间可以直接等价为 \([r_1+1,r_2]\)。
现在提出一个命题:只要有解,像这样做完之后一定保证对于每个左端点有且仅有一个右端点存在,且区间总数为 \(n\)。
证明:由于区间可以二次抵消(\([r_1+1,r_2]\)),所以剩余区间数量 \(m'\le n\),又因为有解,所以 \(m'\ge n\),所以 \(m'=n\),那么每个左端点只有一个右端点,想要凑满 \(n\) 就只能每个都有区间。
那么剩下的 \(n\) 个区间就一定有解了。
但是这个抵消的过程很恶心,所以考虑求一个最大生成树来替代,对于一个区间 \([l,r]\) 视为一条无向边 \((l,r+1)\)。(抵消不需要,因为 \((l,r_1+1)+(l,r_2+1)\) 等价于 \((l,r_1+1)+(r_1+1,r_2+1)\))。
注意特判 \(n=1\) 的情况,这种情况显然没有逆序对,直接选择偶数就赢了。
[20231006]星空
考虑这些形状可以近似地看做一些排列,则答案可以表示为 \(1324-1243-1432=(1x2x-1423)-(12xx-1234)-(14xx-1423)=1x2x-1423-12xx+1234-14xx+1423=1x2x+1234-(12xx+14xx)=1x2x+1234-(1xxx-13xx)=1x2x+1234+13xx-1xxx\)。
用树状数组计算出 \(l_i\) 和 \(r_i\) 分别表示 \(i\) 左边比 \(i\) 小的数个数和 \(i\) 右边比 \(i\)小的数个数。
考虑计算四个部分:
考虑实际上可以枚举 \(3\) 的位置,不妨设为 \(i\),则 \(1\) 的个数就是 \(l_i\),那么 \(34\) 这样的一对就是 \(\sum\limits_{j=i}\limits^{n}[a_i<a_j](n-j-r_j)\)(\(j\) 右边有 \(n-j\) 个数,比 \(a_j\) 小的有 \(r_j\) 个,那么剩下的就是比 \(a_j\) 大的)。
枚举 \(1\) 的位置为 \(i\),事实上就是 \(C_{r_i}^{3}\)。
枚举 \(2\) 的位置为 \(i\),则 \(2\) 右边那个数的取值有 \(n-i-r_i\) 种,考虑在 \(2\) 前面的 \(1x2\) 的取法:实际上 \(12\) 已经不重要了,只需要保证 \(abc\) 中 \(a<c\) 即可,则有 \(132,213,123\) 这三种,我们需要的是 \(132\),考虑容斥:不妨设 \(a\) 的下标是 \(j\),\(c\) 的坐标显然是 \(i\),则在所有情况中(\(132+213+123\))\(b\) 有 \(i-j-1\) 种(\(ij\) 之间任意都可),而不合法情况(\(213+123\))显然是 \(C_{l_i}^2\)。
枚举 \(3\) 的位置为 \(i\),则 \(4\) 有 \(n-i-r_i\) 种取法。考虑 \(2\) 的取值(即 \(132\)):不妨设 \(1\) 的位置为 \(j\),\(2\) 的位置为 \(k\),则只考虑大小关系(\(a_j<a_k<a_i\))的答案为 \(\sum\limits_{k=1}\limits^{n}[a_k<a_i]l_k\),考虑这是由位置关系为 \(jki,jik,ijk\) 构成的,我们实际上只需要 \(jik\),所以需要减去 \(jki\) 和 \(ijk\)。
-
\(jki\):\(\sum\limits_{k=1}\limits^{i}[a_k<a_i]l_k\)。
-
\(ijk=312=3xx-321\):\(C_{r_i}^{2}-\sum\limits_{j=i}\limits^{n}[a_j<a_i]r_j\)。
所以答案就是 \((n-i-r_i)\times \left(\sum\limits_{k=1}\limits^{n}[a_k<a_i]l_k-\sum\limits_{k=1}\limits^{i}[a_k<a_i]l_k-(C_{r_i}^{2}-\sum\limits_{j=i}\limits^{n}[a_j<a_i]r_j)\right)=(n-i-r_i)\times \left(\sum\limits_{k=i}\limits^{n}[a_k<a_i]l_k+\sum\limits_{j=i}\limits^{n}[a_j<a_i]r_j-C_{r_i}^{2}\right)=(n-i-r_i)\times \left(\sum\limits_{k=i}\limits^{n}[a_k<a_i](k-1)-C_{r_i}^{2}\right)\)。
只需要一个树状数组即可。
所以就做完了。
2023.10.7
考得不是特别好,不应该过多关注他人的情况,要自己投入比赛,骗分到最后一刻。
[20231007]月票购买(最短路+DP)
考虑一个性质:如果我们的答案路径和 \(S\rightarrow T\) 的最短路有交,那么交集一定只有一段(如果有两段,可以直接合并)。
那么有一个明显的思路就是对于 \(S\rightarrow T\)的最短路建最短路 DAG,然后求出每个点 \(i\) 到 \(u\) 和到 \(v\) 的最短路 \(disu_i\) 和 \(disv_i\),则对于一个点 \(i\),它可以不花费代价走向它在 DAG 上的支配集中一个点 \(j\),则答案就是 \(\min(disu_i+disv_j,disv_i+disu_j)\)。这就是一个 DAG 上 DP。
[20231007]交通研究(状压dp)
删去最小等价于留下最大。
考虑我们最终留下的边所构成的方案一定是这样的:

结合数据范围 \(n\le 15\) 可知这道题是根据集合的划分进行状压 DP。
不妨称图中在链上的点为关键点,设 \(sum_s\) 表示只选择两个端点都在 \(s\) 中的边的权值之和。
考虑设状态 \(f_{i,s}\) 表示当前所在的关键点点是 \(i\),现在的点集为 \(s\) 的最大贡献和。
那么现在的转移有两种:
-
新建一个关键点 \(j\) 接在点 \(i\) 后面,需保证 \(j\) 不能在集合 \(s\) 中且 \(i,j\) 有边:\(f_{j,s|2^j}=\max(f_{j,s|2^j},f_{i,s}+len_{i,j})\)。
-
选择一堆点 \(s'\) 挂在 \(i\) 上,需保证 \(s\) 与 \(s'\) 无交:\(f_{i,s|s'}=\max(f_{i,s|s'},f_{i,s}+sum_{s'})\)。
[20231007]小Y和地铁(DFS)
个人比较喜欢的一道题,转化非常优美。
由题意答案就是最小交点数。首先考虑在 \(0\) 号线上只出现过一次的点,显然可以自己连自己,所以不用管。
那么现在就变成了只考虑连接点 \(l_i\) 和 \(r_i\) 的最小交点数。
考虑连边有以下这 \(8\) 种情况:

考虑如果出现了一个交点,一定是某一条线的两个端点出现在由之前的连线划分出来的区域的不同区,那么两种连接方法等价当且仅当它们划分出来的区是相同的,在上图中观察可得下两图刚好等价,所以实际上只有 \(4\) 种。
考虑上面 \(4\) 种可以通过左右端点出来的时候朝上还是朝下分为“上上”“上下”“下上”“下下”这几种。
考虑如果对所有线段按照左端点排序,则当计算到第 \(i\) 条线段的时候,“上上”产生的代价恰好就是在 \([l_i,r_i]\) 中之前的右端点朝上的数量;“下下”产生的代价恰好就是在 \([l_i\sim r_i]\) 中之前的右端点朝下的数量;“下上”产生的代价恰好就是在 \([l_i\sim n]\) 中右端点朝下的数量加上在 \([r_i\sim n]\) 中右端点朝上的数量;“上下”产生的代价恰好就是在 \([l_i,n]\) 中右端点朝上的数量加上在 \([r_i\sim n]\) 中右端点朝下的数量。
在结合考虑给定的 \(n\le 44\) 的数据范围,不难想到直接枚举每一个右端点的数量结合树状数组进行统计,时间复杂度为 \(O(T2^{\frac{n}{2}}\log n)\)。
2023.10.8
[20231008] 机器人
先按照坐标从小到大排序,然后考虑最终的答案应该是 \(\sum\limits_{i=1}\limits^{n}|r_i-b_i|\),考虑如何安排顺序才能取到这样的值。
首先对于每一个蓝色机器人动态维护它开机所对应的红色机器人,感性理解一开始一定有一个。考虑当一个已经对应的机器人开机是不会对其它任何机器人造成不利于最终答案的影响,那么考虑当第 \(i\) 个机器人开机后判断一下 \(i\) 的前驱和后继是否对应(去掉之前已经开过机的机器人),就能通过了。
[20231008] 莫德尔
考虑如果现在决定了要放 \(cnt_i\) 个 \(a_i\) 则方案数为 \(\frac{n!}{\prod\limits_{i=1}\limits^{k}cnt_i}\)。
2023.10.13
主要问题是注意力不集中,没有花时间去检查。
[20231012]旅游(欧拉回路+最小生成树)
考虑任何一种环路方案都可以视为在重边有意义下的一条欧拉回路,即度数都为偶数的一种情况,所以这里的加边操作实际上可以视为对两个端点的奇偶性取反。
注意到第 \(i\) 条边的代价是大于前面所有边的权值之和的,所以考虑建出最小生成树之后,在树上做统计。还有一个性质就是在树上每棵子树最多剩下一个奇点(能在树里面抵消完一定比出去优)。
[20231012]反质数序列(二分图最大独立集)
考虑到质数除了 \(2\) 都是奇数,所以如果有 \(a+b=p(p>2)\) 则 \(a\%2\neq b\%2\)。
这个形式非常像二分图,所以问题就变成了一个二分图最大独立集,那么 \(2\) 只能是 \(1+1\) 所以只留下一个 \(1\) 就可以。
[20231012]商旅(floyd+分数规划)
考虑求最大比例,是一个 \(0/1\) 分数规划问题,二分这个权值,不妨设为 \(x\),那么每条边的权值 \(w\) 就变成了 \(xw\)。
考虑如果进行了一次操作 \(a\) 点购买 \(p\),\(b\) 点卖出 \(p\),则可以看做一条从 \(a\) 到 \(b\) 的长度为 \((s_{b,p}-b_{a,p})-x\cdot dis_{a,b}\)。
这个东西看着是和 \(p\) 物品是什么有关的,但是不需要去枚举,可以直接处理一个 \(f_{a,b}\) 表示在 \(ab\) 之间做买卖的最大收益,那么之前的 \(s_{b,p}-b_{a,p}\) 就变成了 \(f_{a,b}\),发现点数很少,用 floyd 即可。
[20231012]回忆构图(图的性质)
事实上 \(c_i=0\) 的关系是具备传递性的,所以考虑用并查集维护。
关于 \(c_i=1\) 的可以在结束之后判断一下是否 \(a_i\) 和 \(b_i\) 在同一个集合,如果有这样的情况就是 No。
现在就只需要判断 \(m\) 是否合法即可,可以计算出一个边数量的上下界 \(l,r\),显然 \(l=n-\prod[c_i=0]\)。考虑到最后的形状是类似于森林的,所以把每棵树的根做成完全图即可让边数最多,即 \(r=n-cnt+\frac{cnt(cnt-1)}{2}\)。
注意特判 \(n=2\)。
2023.10.19
T1
感觉比较原,就快速打完了并且写了个拍。
T2
发现样例非常水,所以应该直接选择手造几组样例来玩,并且结论需要去发现。
T3
不能嫌式子烦,需要去认真解开。
T4
暴力分还是需要去尽量打,然后最好留出一段时间来检查暴力。
2023.10.21
csp
T1
比较弱智吧。
T2
最后才开,然后写了 2h 之后终于过于大样例。
T3
1.5h 写完了,fc 了一下大样例就没管了。
T4
没开,写了个做法样例都过不了,最后赶紧跑路了。
总结就是打得挺好的,最终还是做出了 t2,但是就是时间花的太长了导致 t4 没有想。
upd:机房 3 人 AK,我成小丑了。
2023.10.28
晚上的 ABC326F
??????
补这道
大概就是发现等价于做加减法使得最终的关于 x 轴的答案为 x,关于 y 轴的答案为 y,考虑每次可以左右转,所以两轴是独立的,所以解决这个问题就行了:有一个长度为 \(n(n\le 40)\) 的数组 \(a\),为每一个 \(i\in [1,n]\) 选择 \(1\) 或 \(-1\),对于每个 \(a_i\) 乘上选择的值求和使得这个和为 \(x\)。考虑 meet-in-middle,就完了。
2023.11.4
T1
考虑确定了点 \((0,0)\) 的人数 为 \(a\) 之后点 \((x,y)\) 的人数为 \(\dfrac{C_{x+y}^{x}}{2^{x+y}}a\),那么考虑得到所有点中 \(2\) 的幂次的最小值
2023.11.7
哈哈哈,稳定垫底
B
考虑通项公式为 \(F_n=\frac{(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}{\sqrt{5}}\),考虑代入:
C
考虑对于两个元素 anrhj 的选择是确定的,所以可以按照 \(y\) 为第一关键字先降序再按照 \(x\) 为第二关键字升序排列,则对于任意一个方案一定有一条分界线满足前面都选后面都不选,所以前后缀拿堆维护预处理一下即可。
D
考虑以来两倍颜色的性质构造:对于每种颜色随机化一个权值,查询两条链的最小值,更小的那个大概率更长,随机 \(80\) 次即可,时间复杂度 \(O(q\log^2 nK)\),其中 \(K=80\)。
2024.1.5
新年第一考取得了非常强大的成绩!

浙公网安备 33010602011771号