Training-“在神的盲区虚构一座天堂”
CF1386B Mixture
紫。
首先一定不超过 3 个,考虑怎么判断。
一个就是看有没有和原来的比例一样的,但是剩下的三维限制比较麻烦。
考虑令 \((\frac{x}{x+y+z},\frac{y}{x+y+z})\) 表示每个配比,这样限制就减少到 2 维了。
那么此时以目标点为原点,用 2 个的条件就是有两个在原点异侧且在同一直线上的点。
3 个点有解的情况就是存在三个点,任意两个的夹角均不超过 180 度。
这个考虑断成两部分,用 set 维护斜率,然后就判断最大最小值就行了。
P14515 [NFLSPC #8] 小 P,小 W,棒棒糖
黑。
zxx 牛逼题。这东西显然没办法直接做,考虑容斥,可以发现 \(t+deg\) 就是 \(t\) 和 \(deg\) 个 1。
然后把式子拆开,就是钦定一些点有出边的概率之积乘上若干个 \(t\),考虑状压,\(f_s\) 表示 \(s\) 的集合内都有出边,转移类似于:
\(pf_s \rightarrow g_s,(1-p)f_s\rightarrow g_s,g_{s\cup \{u\}},g_{s\cup \{v\}},g_{s\cup \{u,v\}}\)
然后考虑优化,每 \(k\) 个为一层,只有相邻两层之间有边,算完之后就可以扔掉,这样就 \(2^{2k}m\) 了。
但是可以发现很多状态是无用的,因为如果一个点已经没有连向后面层的边就可以删掉,同理可以在有连向当前点的边再加入。
所以考虑先将每次算完后没有跨层边的删除,如果它的两条边是 \((u,x)(u,y)\),就在 \((x,y)\) 之间连一条边,一条边视为自环。
对每个连通块按照点-边从小到大排序,按照排序后的连通块顺序 dfs,就是加点顺序,这样最大就是 \(2^{k+2}\) 的状态,比较难写。
P9870 [NOIP2023] 双序列拓展
紫。
考虑最基础的做法就是 \(f_{i,j}\) 表示当前匹配到了 \(i\) 和 \(j\),是否存在一条 \((1,1)\) 到 \((n,m)\) 的路径。
然后考虑哪些位置是一定可以走的,这里先钦定 \(y_j>x_i\),那么 \(x\) 的最小值和 \(y\) 的最大值所在行列就一定可行。
然后可以发现就分成了 \((1,1)\) 到 中间和中间到 \((n,m)\) 的两部分,这两部分是相似的。
可以进一步分割,可以继续找最大和最小值,每次能继续缩小要满足 \(max_x<max_y,min_x<min_y\),然后贪心的去删就可以了。
P5825 排列计数
紫。
写一下推导吧。
考虑容斥,基础式子是这样的 \(w(a)=\prod (p_i[f(a_i)=1]+q_i[f(a_i)=0])\),然后我们要求的一般就是 \(\sum w(a)\),可以化成 \(\sum_{S}(\prod{i\notin S} q_i\prod{i\in S} (p_i-q_i)cnt(S)\)
S 表示满足 \(f(a_i)=1\) 的 \(i\) 的集合,\(cnt(s)\) 表示包含 S 集合的 a 的数量。
然后这道题就是令 \(p=x,q=1\),条件就是 \(a_i<a_{i+1}\),可以发现答案就是每一项的系数。
然后就是将 \(n\) 个数划分成若干个集合,集合之内要求升序,集合之间随意,集合考虑顺序,就是 \(\{^n_k\}k!\)
把式子化简一下就是 \(E(n,m)=\sum i^n(-1)^{n-m-i}C_{n+1}^{m+i+1}\)
把 \((-1)^{n-m-i}\) 换成 \((-1)^{n+m+i}\) 然后 NTT 就完了。
P10004 [集训队互测 2023] Permutation Counting 2
黑。
感觉是很牛的二项式反演啊,先贴个式子:若 \(g(i)=\sum C_j^i f(j)\),有 \(f(i)=\sum (-1)^{j-i} C_j^i g(j)\)。
首先考虑答案为 \(f_{i,j}\),记钦定第一个序列有 \(i\) 个位置是上升,第二个序列有 \(j\) 个。
\(g_{i,j}\sum_{x\ge i} C_x^i \sum_{y\ge j} C_y^j f_{x,y}\),反演就是 \(f_{i,j}\sum_{x\ge i} (-1)^{x-i} C_x^i \sum_{y\ge j}(-1)^{y-j} C_y^j g_{x,y}\)
考虑怎么求 \(g_{i,j}\),考虑 \(c_{i,j}\) 表示在第一个序列 \(i\) 号连续段,第二个在 \(j\) 号,那么 \(g_{n-i,n-j}\) 就是 i 行 j 列每行每列都有值,并且和为 n 的方案数。
考虑 \(t_{i,j}\) 表示只满足和为 \(n\) 的方案数,那么 \(t_{i,j}=\sum_{x\le i}C_i^x\sum_{y\le j} C_j^y g_{n-i,n-j}\),反演即可。
P14384 [JOISC 2017] 烟花棒 / Sparklers
黑。
显然二分,然后考虑判断可行性。
考虑到一定是快要灭的那一刻去传递,有一个必要条件,就是如果区间 \([l,r]\) 能顺利传递,那么 \(x_r-x_l\le 2Ts(r-l)\),然后猜想如果子区间满足这个条件就可以转移到 \([l,r]\)。
考虑证明充分性,因为一定是两端的点向中间移动,速度一样间距不变,只有中间的两端间距会减小。
此时中间的人就可以选择和一边的合并,那么此时的总时间变为 \(2T\),然后两个点合并又回到了第一个问题。
而且可以发现在这种策略下弄完一个区间的时间是恒定的,因为可以将转身的部分直接看作合并前两点的相遇,所以一定是 \(\frac{x_r-x_l}{2s}\)。
然后考虑改一下上面的式子,有 \(2Tsr-x_r\ge 2Tsl-x_l\),然后从 \(k\) 处断开,区间扩展的过程就可以看作寻找一条 \((k,k)\) 到 \((1,n)\) 的路径,使得前面的小于等于后面的。
将前面部分反向,就是双序列拓展。
CF1458D Flip and Reverse
紫。
我说我为什么紫题一点思路都没有,*3100 的构造我做个空集啊。
首先 0 变成 -1,画前缀和折线图,每一次操作就是左右进行一个翻转。
考虑贪心的去选,考虑如何判断能不能放 0。可以发现因为每次反转左右端点的前缀和值都是一样的,所以相邻关系是不会发生改变的。
以前缀和值作为点,相邻就连边,可以发现一个合法的情况就是求一条欧拉路径,因为一个数只有两个相邻点,所以可以直接判断能否向下走。
CF1685C Bring Balance
紫。
感觉无敌了,显然先转成图像,然后观察发现每一次翻转就是以端点连线的中点为对称中心进行对称。
经过几何证明,记区间最大值为 \(mx\),一个区间反转后不会到 0 下方的条件就是 \(mx\le s_l+s_r\)。
一次翻完的条件就是找到最左和最右的负数,然后找到前面和后面的最值,和序列最值判断。
否则翻转 \([1,mx],[mx+1,2n]\) 一定是成立的。
CF1503F Balance the Cards
黑。
*3500 的构造,使我的大脑旋转。
首先考虑将卡片作为点,然后正向对应的负值连边,那么一共 \(2n\) 条边。
然后考虑规约问题,如果三个点 \((a,b),(c,-b),(-c,d)\),那么这个显然等价于 \((a,d)\),然后就可以一直规约直到不能做。
如果最后剩下来的是 \((a,b),(-a,-b)\) 就可行否则一定会矛盾。
构造上找到一正一负的点扩展,然后递归还原就行了。
P8376 [APIO2022] 排列
紫。
写法太非人了导致的/ll。
首先考虑先取一个递增序列,然后进行一个二进制拆分得到一些位置上为 1,在为 1 的位置上插入一些较小数。
但是这样是 \(2\log\) 级别的,因为 \(90=1.5\log\) 所以考虑怎么把插入的数减少。
如果前面已经存在 2 个插入的数,那么如果这两个数都比当前数小,就是三倍贡献。
所以可以两两分组,然后如果都为 1 那么就可以通过这种方式将前面的去掉。
链表维护即可。
P14880 [ICPC 2019 Yokohama R] Halting Problem
黑。
考虑发现经过每个 \(i\) 到 \(c_i\) 的边时状态是确定的,所以每条边最多走一次否则一定是环。
考虑对每条边之后的状态维护到达的第一个 \(x=a\) 的位置。
可以发现其余不等边的转移构成了若干基环树和一颗以 n+1 为根的树,对于非环的部分,可以记录 \(a_x\) 和到当前位置链上权值的和,开一个 set 维护直接查。
对于环上的部分,先给初始值加上链长,记当前点为 \(u\),\(s_x\) 为断环为链后的前缀和,有 \(kl+a_u-s_u+s_x=a_x\),可以发现就是在同余的情况下满足 \(\lfloor \frac{a_x-s_x}{l}\rfloor-\lfloor \frac{a_u-s_u}{l}\rfloor\) 最小。
注意 \(l\) 是 0 的情况,set 维护即可。
P14768 [ICPC 2024 Seoul R] Ladder Update
紫。
可以发现撤销就是换回去,所以可以看作加边,然后就只剩下一种操作了。
考虑维护每个杆子上存在的点,每次加入就是找到上方的第一个点,然后将下面的操作互换。
可以用 treap 维护,然后每个点维护所在高度和他的父亲,找到的根就是要交换的值。
现在知道每次交换的点,考虑统计逆序对的变化量,就是 \(i<k<j,p_i<p_k<p_j\) 的点的数量,加上时间一共三维限制,分治即可。
P17286 「IXOI R2」Horizon Blue
黑。
根本不是人,最长代码最终还是易主了。
首先考虑分治,块内是好求的,考虑如何合并两块的信息。
可以对跨过中点的位置进行处理,考虑维护左右的前后缀最值,然后看对面有多少个比它小的,这样就可以知道以它为端点的贡献区间个数。
考虑修改,每次就是把到第一个比他大的点的最大值和另一侧的对应长度修改,将另一侧的原本选到修改点现在不能选到的-1,将恰好大于当前点的更新。
考虑询问,就是分成两部分,一个是对应的超过边界的,就乘以边界,否则直接求和。
需要知道最大值之和,最大值的 max 和长度的 max,还有乘积之和,还有区修区查+找第一个大于的点,线段树二分。
P15534 【MYCOI R1】那猫猫城的集市
紫。
终于想起来补这个了,感觉不难但是那场 t3 写了个无比抽象的做法导致只写了 \(n^2\)。
首先可以发现 \(1->u\) 和 \(u->1\) 是一对相反的操作,所以这东西是可差分的,就可以拆成 4 条链分别处理。
然后就是计算 \(f_{i,0/1}\) 表示 \(a_i,b_i\) 到 1 换成了什么,把询问离线下来,向上的部分就是找到第一个存在 \(x\) 的点。
因为过程可逆,所以向下的部分就是找到最靠下的满足 \(f\) 中含有 \(x\) 的点,对应的 \(a / b\) 就是答案。
P14099 [POCamp 2022] 一安在?2 / Where's Waldo?
黑。
随机化???
首先考虑两两分组,然后排除掉和 \(x\) 超过 \(n+1\) 的,以及 \(x-1\) 出现过的,然后就询问其中一个,大概是在 70-80 分。
考虑这是一个类似于区间拆分的东西,和越小区间有 1 的概率越大,所以可以优先队列,找到中点分开。
排序的时候让长度较小的在前,平均值和长度均相同随一下。
P17537 [JAG 2026 Summer Camp #1] Rabbit, Rabbit, Rabbit
青。
什么叫 5min 会了,1h 不会证?
首先发现必须移动步数的奇偶性相同,所以如果数量不对直接无解。
考虑到尽量要需要动的步数少,所以我们直接排序然后对位移动,然后根据均值不等式,尽量先移动同一个方向一定更优,然后就完了。
P17543 [JAG 2026 Summer Camp #2] Deque Bracket Optimization
紫。
显然 1,3 是简单的,把中间的拎出来,就是每两个取一次 max,用堆维护即可。
然后考虑 2 操作,因为开头结尾都要加,所以奇偶性会变化,断点也会变,考虑维护两个去转移。
可以记录头尾各去掉 1/2 个的情况,这样每次就是在较短的那个做一次头插入一次尾插入,就结束了。
[ABC464G] Celester 2
紫。
首先记 \(a_i\) 为 \(i,i+1\) 改为 \(RS\) 的所需步骤,然后可以发现就是选出若干个不相邻的 \(a_i\) 使和最小。
然后就是经典 trick,首先选出一个数,把它反悔掉就是选出旁边的两个数,那么它的新贡献就是 \(a_{i-1}+a_{i+1}-a_i\)。
此时就要将旁边的点删去,因为不能继续作为中心了。类似的,如果再次返回就是由 24 变为 135,然后链表维护即可。
P8978 「DTOI-4」中位数
黑。
看到中位数想二分,然后看能否在 k 次操作里变成全大于等于。
将大于等于的部分视作 1,其余视作 -1,然后每次修改的段的和一定 >0,可以证明修改一定是包含的。
设 \(f_i\) 表示以 i 为左端点,所能修改的右端点的最远是哪个。
可以发现如果 \(sum_{i-1}\) 不是前缀 min,那么这个转移是无效的,去掉后 f 显然有单调性。
记 \(c_i\) 表示这段区间的修改贡献,那么一个端点合法的情况就是 \(s_{f_i}+c_x-s_{i-1}>0\),即 \(s_{f_i}>s_{i-1}-c_x\)。
然后可以发现 \(c_x\) 可以单调队列维护,然后维护一下大于每个值最大的右端点即可。
P11773 巅峰手速
黑。
下面会出现大量注意到,如感到不适请立即离开。
首先注意到可以看作两个环,操作就是在两个环上进行移动。
我们先钦定最后就是两个环的交界点最后停在开始时的位置 k,那么对逆序对的修改一定是偶数,所以如果复原开始时逆序对数不为偶数就会无解。
所以第一次操作直接对原序列进行,改变逆序对的数量,如果 n,k 均为奇数,就无法修改,那么无解。
考虑用两个数组记录两个环上每个位置的值,以及和另一个环的接口,那么一次旋转就是 \(ls-1,c_{rs}=a_{ls}\),反之亦然。
然后就是暴力将每个点转到对应位置,这样只能获得 4n 的方案,因为处于同侧的你要重新换位置。
有一个方法就是利用置换环,换完后就可能存在一个点由同侧变为异侧,那么就把这个点在下一次归位。
我也不知道是不是假了,所以选择了正跑一边反跑一边选更优的。
P9962 [THUPC 2024 初赛] 一棵树
黑。
首先可以发现这玩意就是树上背包,但是 \(n^2\) 肯定不行。
考虑每次做的贡献形式,就是一个以 \(\frac{k}{2}\) 为最低点的绝对值函数,增减量为 2,然后整个操作就是卷积和取 min。
所以可以直接用平衡树维护凸包,每次启发式合并把新的插进来,加入 \(u\) 点时就是 \(f_i=min(f_i,f_i-1)\),就是插入一个 0。
卷上一个绝对值函数就是区间修改,类似线段树做一下就完了。
P12585 「KTSC 2019 R1」广播站
紫。
我咋给这玩意忘了?
首先可以发现最后一定是类似于树的形式,而且 \(x\) 的子树必然是包含 \(x\) 的区间。
所以考虑区间 dp,最朴素的方法就是枚举深度和区间,\(f_{l,r,d}\) 表示区间 \([l,r]\),深度为 \(d\) 的结果,然后再去枚举根,各种优化一下可以到 \(n^5\)。
这显然很没有前途,考虑 \(fl_{l,r,d},fr_{l,r,d}\) 分别表示根在左或在右端点,然后用辅助数组来记录。
令 \(gl_{l,r,d}\) 表示即将连到的根为 \(l\),连向它的点是 \(r\),那么就可以枚举分界点用 \(fl_{l,k,d}+fr_{k+1,r,d}\) 转移。
向 \(fl_{l,r,d}\) 转移就再枚举一下中间点,补上 \(fl_{k,r,d}\) 以及边的贡献即可。
[AGC035E] Develop
黑。
k 为偶数就是奇偶分开,不能有连续 \(/frac{k}{2}+1\) 个 0。
奇数比较麻烦,将点向它会影响的点连边,那么就是一个环上的点就不能同时不存在。
考虑将偶数部分不动,把奇数点放在连向它的偶数点的对应层,那么就是一个从右侧出发的点到左侧点的链长度不超过 \(k+1\)
设 \(f_{i,j,k}\) 表示当前在第 \(i\),层,左右链长度分别为 \(j,k\)。
都不选就是 \((0,0)\),选右边就是 \((0,k+1)\),左边的话因为右边没有,那么左边如果是 0 就没有和右边相连,就是 \((0,0)\)。
如果都有的话就是从右边来一个或者继承 \((max(j+1,k+2),k+1)\)
P9266 [PA 2022] Nawiasowe podziały
黑。
这好像是板子,首先答案具有凸性,上 wqs 二分。
然后这东西有决策单调性,所以可以直接分治做。
可以发现两个括号之间的部分可以配对当且仅当前缀和相同且前面的为左括号,后面为右括号,并且中间不出现负数。
那么新加入一个点的贡献就是记录已经存在的每个前缀和的数量,和它能取到的最多的数量取 \(min\)。
这就是一个类似于莫队的形式,但是因为两个转移的位置不同,一个是 \((p_l,p_r)->mid\),另一个是 \((l,mid)->r\),两个莫队维护就是对的。
CF2081D MST in Modulo Graph
蓝。
注意到按照每 \(p_i\) 个分成一段,只有最小的那个可以和 \(p_i\) 连边,否则向前连一定更优。
所以可以直接找到边,然后 Kruskal 即可,边数 \(O(n\ln)\)。
CF2057E2 Another Exercise on Graphs (hard version)
紫。
感觉是简单的,首先注意到一定是最小生成树上的边,然后对每个边找到每个点经过的比他大的边的数量最少是多少。
然后询问时按照边权从小到大,如果经过数量和 \(<k\) 那么就是答案。
P9753 [CSP-S 2023] 消消乐
青。
不会做的是神经病,我就是。
怒战 1h 比 tj 多了一个 log,考虑到最后留下来的栈,如果两个方向相反的栈元素顺序相同,那么就可以消掉。
最简单的方法就是分治,然后直接哈希即可(你怎么知道我这么神经病)。
注意到其实可以直接从前往后跑一边,然后栈状态相同的前缀之间就是满足条件的。
P9754 [CSP-S 2023] 结构体
蓝。
按题意模拟即可。
P9755 [CSP-S 2023] 种树
蓝。
何数据何样例何智力?
首先考虑二分,然后就是一个方程,显著不会解所以选择了二分。
然后求出每个点最少要什么时候到,然后递推取 min 求出父亲的时间,排序之后看是否有 \(mx_i<i\) 即可。

浙公网安备 33010602011771号