qbxt2023国庆刷题 Day1 ~ Day3

本帖涉及以下内容:

  1. 超长内容
  2. 感性理解
  3. 思路引导
  4. 屑排版
  5. 恶意卖萌

Day0

晚上玩恐怖游戏好吓人 QwQ

Day1

rk4,前 5 有小奖品

T1

没什么好说的

T2

原题

给定一个等差数列,求他的各项乘积,你只需要输出其对 1145141 取模的结果。
具体的,每组给定 d,n,a 分别表示公差,长度,首项,你需要求出 i=0n1(a+i×d)mod1145141

非常降智好的一道题,赛时往根号分治想,然后寄掉了

我们考虑 d=1 怎么做,显然阶乘,然后判断是否包含 mod 的倍数即可,复杂度 O(mod)

然后推广到普遍情况,我们把这个式子提出来 d 变成: dni=0n1(ad+i)mod1145141

这不就是 adad+n1 的阶乘吗。我们得益于乘法逆元,可以直接用 a×d1mod1145141 来代替

注意特判 d=0 的情况即可,最终复杂度 O(Tlogmod),瓶颈在快速幂

T3

原题

一条路径上有 n 个位置,有三种元素:slimenpcplayer
slime 初始会向右移动,npc 初始会向左移动,所有元素移动速度是相同的:1 单位距离每 1 单位时间。
元素的移动遇到边界会改变初始移动方向,并继续移动。
我们称 playernpc 为人类,npc 带有初始为 0 的能力值。
你作为 playernpc 有相同的移动规则,由于带有主角光环,你若出生在位置 i 初始会有 si 的能力值。
若有某两元素相遇,他们会开始战斗,战斗不改变移动方向,战斗总是遵循以下两种规则。
1、人类与 slime 相遇:人类总是胜利,胜利后人类能力值 +1
2、人类与人类相遇:能力值大的获胜,若能力值相同,则 player 获胜,能力值不发生改变。
可以证明,这两条规则覆盖了所有情况。
失败的一方将被立刻移除游戏,胜利的一方将仍继续行进。
由于你是主角,你的左侧总是以 100% 的概率刷新 slime,你的右侧总是分别以 50% 的概率刷新 npc 或者 slime
对于 1,n 两个特殊位置有特殊的刷新规则:1 号位置总是 slimen 号位置总是 npc
你需要求出来你以相同概率随机出生在 [2,n1] 的某一位置,经过 单位时间后,仍存活的概率。
你需要注意,游戏的进程总是 player 先刷新,然后以一定概率刷新 slimenpc,然后开始游戏。
可以证明概率总是一个有理数 xy,你只需要输出这个数对 998244353 取模的结果。
保证 s1=sn=0
对于所有测试点满足 3n5×105,0si109

一道二项式反演题

我们假设现在在考虑第 i 位,令 B=si+i1 ,我们让 f(n) 表示钦定 nslime 长度 =B+1 ,之后跟一个 npc 时的方案数(这里如果 >B+1 的连续段怎么办?一会再说),我们可以知道 g(0)=i>0(1)i(i0)f(i)=i>0(1)if(i)

我们考虑怎么求 f(k) ,我们用组合数,我们先确定 k 个连续段,然后考虑往这 k+1 个位置里插入剩下的 ni1k×(B+2)slime (其中 1 的原因是我们钦定的是 slime ),这里直接用插板法:把这些史莱姆插到 k+1 个空里的方案数

一些细节:由于 n 号节点始终是 npc ,我们要讨论在钦定不满足条件的连续段时是否钦定了 n 这一个 npc

复杂度分析:有人觉得这是 O(n2) 的,但我们发现玩家在 i 位置时能力值至少为 i1 ,因此复杂度为调和级数,最终复杂度 O(nlogn)

T4

原题

一行人,共有 n 个人,排成一排,在等待你发放矿泉水。
你会发放 m 轮矿泉水,第 i 次,你会给前 ai 个人发放矿泉水,然后你会发放 bi 瓶矿泉水。
具体的,你每次会一瓶一瓶的发矿泉水,每一轮发放 bi 次。
每次,你会把矿泉水给最需要的人,即前 ai 个人中,当前拥有的矿泉水最少的人,如果有多个人拥有数量相同,你会发给编号靠前的人。
最终,你想知道每个人获得的矿泉水数量。
n,m105

首先,我们看答案是单调不降的,因此我们可以线段树 + 二分,而不是树套树之类的

从来没做过在线段树某个前缀 or 区间上二分的问题,学到了

LL k;
int search(int x, int p = 1){
	int l = tr[ p ].l, r = tr[ p ].r;
	if(r <= x && (LL)tr[ p ].maxs * (x - l + 1) - tr[ p ].sum <= k){
		k += tr[ p ].sum;
		return l;
	}
	if(l == r) return r + 1;
	PushDown(p); int mid = l + r >> 1;
	if(x <= mid) return search(x, ls);
	int rt = search(x, rs);
	if(rt == mid + 1) return search(x, ls);
	return rt;
}

大致就是判断右边如果能放就放右边,否则放左边

最终复杂度 O(nlogn)

p.m. 杂题选讲

原题

最朴素的是 3n 枚举,爆炸

考虑我们如果 2n 找两个和相同的方案,然后让第一个 第二个依然合法。因为题目保证 p<2n ,因此一定有两个子集之和 modp 值相同。优化成 O(2n) ,爆炸

数据范围提示 meet in the middle ,但我们如果不知道这个和是多少不好做

哪有问题解决哪里,我们二分这个和是多少。具体的,我们考虑答案值域为 [l,r] 时方案数,显然 >rl+1 ,然后我们通过爆搜判断 [l,mid] 值域内方案数是否 >midl+1 ,如果不满足,右边显然满足。考虑通过 meet in the middle 来判断这个东西,这里的复杂度是 O(2n2logn)

二分到最后我们知道了具体的值就好做了,直接找即可

最终复杂度 O(2n2logn)

Day2

100+30+0+40rk8 ,感觉打的好烂,考试的状态也不好

下午讲课的时候感觉自己应该都做出来的,但赛时 T1 死磕了两个半小时,时间分配不太合理

T1

在赛时看到了这个科技,因此并不算自己做出来了

首先,容易发现答案具有二分性,我们把 ai 排序后二分答案

然后赛时我在想如何贪心的把一个数放到一个没放的位置,后来发现做法假了就有点慌。

提到整除通常都是判断质因数的关系。我们发现 n 很大,有 109 ,但我们发现我们会判断到的质因数只有 2×105 这些,因此我们直接用上面那个科技就可以是实现分解 n! 的质因数

而对于二分了一个 k 后我们如何找到答案?我们可以用欧拉筛找到 2×105 中每个数的最小的质因子,然后暴力加到一个桶里,最终 O(n) 判断即可

最终复杂度 O(mlognlogm)

T2

我们考虑从特殊 普通的情况,因此我们先考虑 k=2 怎么做,显然的是区间 dp 问题,可以做到 O(n3)

然后考虑 k>2 时怎么做,我们发现如果继续设 dpl,r 表示合并区间 [l,r] 时的答案的话,合并是困难的,因为我们一次必须合并 k 个数。因此我们要再添加一维 dp 。我们设 dpl,r,c 表示区间 [l,r] 内合并成 c 个数时的答案,其中 1ck 。容易发现,当 lr 时, dpl,r,1=dpl,r,k+i=lrai ,即把这 k 个区间合并了

然后我们考虑这个 dp 怎么转移。我们考虑在一个区间内,他的第一个合并从何而来,即 dpl,r,c=mini=lr1dpl,i,1+dpi+1,r,c1

我们分析一下这么递推的复杂度,显然是 O(n3k) ,不足以通过此题。但我们发现有些区间是不合法的。具体的,某一个区间 [l,r] 内分成 c 段合法,当且仅当 k1|(rl+1c) 。这说明固定一个区间的左端点,他合法的右端点有 O(nk) 个。因此这个 dp 的复杂度其实是 O(n3k) 的(因为枚举当前区间右端点和 dp 转移时都要枚举右端点,所以可以让复杂度 ÷k2)

T3

赛时看了一眼觉得是容斥,然而 dp 我不知道要记录那些信息啊,遂寄掉了

对于这种有区间限制的题,我们要这么考虑 dp

  1. 去除多余限制,使左右端点始终保持
  2. 转移记录最靠右边的满足条件的信息,因为越靠右边越容易满足限制

对于此题,我们发现如果两个区间互相包含,我们只要小的那个区间即可。这样我们就让所有区间在左端点有序时右端点依然有序

对于第二步,我们设 dpi,j 表示前 i 个数中最靠右边的有两个相同值的数的左端点j 的方案数

转移是容易的,从这个数依然是不相同的和这个数和前面某个数相同两种情况转移过来即可,最终复杂度 O(n2)

然后考虑正解,我们抛去上面我们所想,考虑容斥。首先考虑 k10 怎么做,我们 O(2k) 枚举我们钦定哪些区间不符合要求。可以发现区间分成相交和相离两种情况,对于相离的区间是好做的,相交的要注意交点的部分,也是不困难的

然后扩展到 k50 ,我们发现我们没必要知道哪些区间是不合法的,我们可以考虑 dp ,设 dpi 表示第 i 个区间必须不合法的方案数(这里的方案数是带容斥系数的),然后枚举上一个区间时判断相交还是相离即可,最终复杂度 O(n)

T4

没什么好说的,只能说赛时最好想的一题,但是是最难写的罢了233

对于所有边和每个点维护动态开点线段树或平衡树即可,注意使用线段树/平衡树二分,而不是直接二分答案,否则会多带 log 过不去

赛后杂题选讲

P8163 [JOI 2022 Final] 铁路旅行 2 (Railway Trip 2)

做题是很重要的,讲课时一个大佬说这题和今年省选 T1 思路很像, %%%

这题是一道很神奇的题。

我们发现如果这个人跳了若干步,他能跳到的点一定是一个区间,因为我们考虑他能从 s 跳到 t ,那不管他经过的路程长什么样,他都可以在中途下车,来走到 [s,t] 中的某个点

又因为这题多组询问, K 还不变,多次重复某个操作,答案可以合并,因此我们考虑倍增

Li,j 表示从 i 点走 2j 步能走到的最左左端点, Ri,j 同理

可以发现 Li,j=mink=ii+2j1Lk,j1 ,我们发现这是一个区间 min 的问题,我们可以神奇的在倍增里套一个 st 表来维护这个东西。 Ri,j 同理。

最终复杂度 O(nlog2n+Qlogn)

01trie 小技巧

  1. 找两个数疑惑和最小(显然)

  2. 给你一个集合有以下操作

    1. 全局 + 1
    2. i=1naix

    如果只有2操作,我们显然可以直接按位考虑,但有了 +1 操作,这个东西我们可以把这些数的二进制倒着插入 01trie 中,对于一次 +1 操作,我们就是把一个点的左右子树交换,然后递归到 0 边去,让他一直更新即可

  3. 给你一个集合有以下操作

    1. 全局 + 1
    2. 插入一个数 ai
    3. i=1nai

    这个第二个思路很像,但重点在于怎么用 01trie 维护第三个操作。我们可以对于每个节点维护当前节点为根时的答案 vali ,再维护当前子树大小 sizi ,可以知道 valu=(valls<<1)(valrs<<1)|(sizu&1)
    例题:# P6623 [省选联考 2020 A 卷] 树 (显然是板子)

树状数组的一些注意

  1. 树状数组不能做到单点修改,只能做到单点加
  2. 树状数组不能做到单点修改前缀 min ,但可以做到单点取 min 前缀 min

总结:树状数组只能更新,不能修改,也就是说对于一些不具有可减性的问题,树状数组不可维护

再谈acwing 299. 裁剪序列

上课讲的题目差不多的例题

还是可以得到 dpi=minj=pii1{dpj+maxk=j+1i{ak}}

我们考虑扫描线,线段树记录 fi=dpi1+maxj=irai

考虑右端点 r 向右移动时会影响哪些答案,答案显然是一个区间,可以用单调栈求出这个区间,区间加区间 min 即可

最终复杂度 O(nlogn)

CF1635F Closest Pair

第一眼看的时候以为是线段树维护信息更新的问题,但发现计算的内容和左右端点都有关,遂寄掉

然后听老师说是扫描线,继续思考。考虑固定一个右端点时,哪些左端点可能成为答案,显然左端点的 wi 是单调递增的,于是可以用单调栈维护决策集合,但之后就卡住了

然后看题解,发现对于一个数 i ,他更新时只可能从 Li,Ri 更新,其中 Li 表示 i 作为右端点时,在左边找一个最近的 j 满足 wjwiRi 同理,也要满足 wjwi

这为什么是对的呢?我们考虑如果有两个在单调栈中的元素,下标分别是 j<k<i

此时显然有 xj<xk<xi​,以及 wj<wk<wi​。那么此时我们说,元素对 (i,k) 一定不是最优解。

为什么?因为 xj<xk<xi,wj<wk<wi,故 xkxj∣<∣xixk,wk+wj<wi+wk

xkxj(wk+wj)<∣xixk(wi+wk)

xkxj(wk+wj) 在枚举到 r=k 时已经计算过了,故此时只有 (j,i) 可能有用。

于是我们把 [Li,i] 看成一个线段,权值为 w 。现在问题就变成了给你一个区间,让你找出这个区间内完全包含的所有线段中权值最小值,这个可以把一个线段看成一个长为 rl+1 ,宽为 w 的矩形,二维数点,遂解决问题

此比较难想的性质就是 LiRi 这个东西,发现只有相邻的有用是此题的关键

DLC

晚上 CFABCD , 前四题和后四题难度跨越挺大的,不过至少上分,题解放到之后

Day3

40+100+100+30,rk8 ,上午状态挺好的,不知道为什么熬夜就 rp++ ,不过 T1 写挂了(我刚提的rk3啊)

T4 看错题了,而且刚知道哈密顿路径是 NPC 问题。好险,差点证明P = NP

T1

先把最大的 mex 取出来,然后考虑剩下的数中还能凑出一个最大的 x ,那显然对于所有 yxy 都是可以被凑出来的。

因此我们每次贪心的让 y 能把 ans 补过来就补一下,最终复杂度 O(n+logn)

T2

对于每一个黑点,去距离他最近的一个白点,贪心是优的,因此直接把路径长度加上即可

求最近的白点用并查集

T3

老师曰:这个题 n106 ,做法显然不是非常朴素的把图建出来,这时候要考虑两种方式,要么是用一些建图优化把图建出来,要么是用一些别的方式代替朴素的最短路,而这里是前者

显然因为是二进制操作,安位贪心,发现对于每一位我们要把是 1 的两两连边,这很坏,所以我们建一个中介点,暴力跑 dijO(n(nlogn)log(nlogn)+Q)

然后这里有一个没有部分分的优化,我们发现这个复杂度恨不均衡, 询问 O(1) 解决,预处理却要 O(n2) 以上的复杂度,因此我们平衡一下

我们发现每个点有两种情况:要么经过中介点,要么没有。我们可以从每个中介点跑 dij ,询问时枚举 st 经过了哪个中介点或没有经过即可,复杂度 O(nlog3n+Qlogn) 左右

还是不平衡,继续优化,我们可以在询问时看 sxyt ,其中 xy 是中介点,我们对于所有中介点跑一个 floyd 即可,复杂度 O(nlog2n+Qlog2n) ,卡卡常数能过

继续优化,我们先看看 O(nlog2n) 能不能优化掉。我们现在想一个点 a ,是的他被两个中介点 x,y 同时相连。这说明什么,这说明 a 这个点的权值二进制第 x,y 位都为 1 ,因此我们可以让每一个 aSmin(aS+{j},aS) ,也就是让每个点和他的超集min, 复杂度 O(nlogn+Qlog2n)

for i : 1 -> n
	b[ a[ i ] ] = a[ i ]
for S : 0 -> 2^n - 1
	for j : 0 -> n - 1
		b[ S - j ] <- min(b[ S ], b[ S - 2^j ])
for i : 0 -> n - 1
	for j : 0 -> n - 1
		dis[ i ][ j ] = b[ 2^i + 2^j ]

继续优化,我们考虑询问能不能也优化成一个集合,设 mni,S 表示从 i 这个附加点开始到 S 集合内的点的最小距离,可以做到 O(nlogn+Qlogn)

T4

朴素 dp 的话,设 dpi,j,S 表示在走 S 集合内的点,从 i 走到 j 最短路

转移 dpi,j,S=minx,y{dpi,x,S+dpy,j,T+dis(x,y)}

其中 S 代表的并不是真的 O(2n) 枚举,而是每次把数分成两半时方便判断

这个 dp 的复杂度乍一看 O(n5) ,但其实是 O(n4)

观察状态,虽然集合有 n 个,但大小为 n 的集合有一个,大小为 n2 的集合有两个,大小为 \frac{n}{2^k} 的集合有 2k 个。因此状态数是:

k=0logn(n2k)2×2k=n2k=1logn12k=n2

考虑怎么优化,我们发现转移式子 dpi,x,Sdpy,j,T+dis(x,y) 这两项只有一个 x 为止,因此我们可以预处理出对于固定的 xmin{dpy,j,T+dis(x,y)} 的值

当然,为了方便实现,我们直接改 dp 状态也可

dpi,j,S 为在走 S走这个集合前走的最后一个点是 i ,最后 j 最小答案

dpi,j,S=minx{dpi,x,S+dpx,j,T}

最终 O(n3)

虽然能过,但还可以更猛一点

我们 dp 状态中的 S 不过是为了方便考虑而使用的,想猛就要放弃好写。我们发现如果知道走的是第 i 个点,当前在 k 时,我们是可以知道当前是什么情况,下一步要走什么点

因此,只要设 dpi,k 表示走了 i 个点到 k ,转移枚举下一个点走到哪,复杂度 O(n2logn),因为

k=0logn(n2k)2×2k×2k=n2logn

DP 杂题讲解

  • 容斥:没有不满足条件的方案数:

S(1)|S|f(S)

其中 f(S) 表示钦定集合 S 条件不满足,其他不钦定的方案数

  • 无向图求哈密顿路径方案数
    n18
    空间 2MB

    状压开不下了
    我们把哈密顿路径的定义拆开:找一个路径,每个点恰好经过一次
    恰好很难办,转化以下:找一个路径,每个点至少经过一次,路径长(这里是经过点的个数)为 n 方案数
    Or 找一个路径,每个点至多经过一次,路径长(这里是经过点的个数)为 n 方案数
    容易发现这两个都是满足哈密顿路径的性质的
    我们思考至多一次反义词为超过一次至少一次的反义词是没有一次;显然后者更好做,因此我们枚举哪些点没有被碰到,然后 dp 。设 dpi,j 表示以 i 结尾,路径长为 j 的方案数。转移枚举下一个点是什么,转移复杂度 O(n3)

  • loj575
    排列是一个很困难的东西,为了解决排列有以下几种方法:

    1. 考虑相对大小
    2. 容斥
    3. n! 优化为 2n
      这题后者,我们考虑如果只有 < 怎么做,太显然了;然后考虑枚举哪些 > 不满足条件,剩下的随意。发现方案数和 > 的长度有关系。具体的,假设长度分别为 l1,l2,...,lp,答案为 (nl1,l2,...,lp)=(nl1)(nl1l2)...(nl1l2...lt)=n!l1!l2!...lt!
      可枚举哪些 > 不满足还是太困难了, 考虑 dp ,设 dpi 表示考虑前 i 个数的方案数, dpi+=(1)k×dpj1×(i+1j)   (aj=>) ,其中 k[i,j] 之间 > 的个数,表示这些 > 被强制扭成 <
  • 内向树拓扑序数量
    每个点应该是子树内最后一个点,因此答案要除以 sizu
    因此总方案数为 n!sizi

  • 再谈P4099 SAO
    我们把 loj575 和 内向树拓扑序计数 缝合一下就可以了。钦定一些朝下的边不满足,剩下的随意,这棵树就变成了一个内向森林,答案即为 n!sizi
    太暴力了,再考虑 dp 优化容斥。我们发现 sizi 是我们想要的,因此设 dpu,x 表示以 u 为跟,子树有 x 个点方案数(带容斥系数)。

    • 对于一个 vu 的边,显然的树形 dp 合并, dpu,x×dpv,ydpu,x+y
    • 对于一个 vu 的边,我们判断这条边是否翻转。
      • 若翻转, dpu,x×dpv,y×(1)dpu,x+y (注意容斥系数)
      • 若不翻, dpu,x×dpv,ydpu,x

n+1 个点 a0an ,玩家初始在 0 号点,初始能量为 a0 ,每次只能走到自己没走过的、比自己能量小的点,并让自己能量加上这个点的权值,方案数。
n105,ai50

我们考虑 dp 哪些信息是重要的

我们发现以下性质:

  1. 编号不重要,没有一个限制条件和编号有关
  2. ai=0 的点不用考虑,没有用
  3. 能量 50 时随便选
  4. 最多要考虑的只有 50 个数
  5. 50 划分成可重集和的方案数为 105 级别

因此我们可以 mapvector

  • 要么相离要么包含,没有交叉信息
    CF1572C
    这题比较简单,但让我想起了腾飞营讲的CF1178F2

  • 当朴素 dp 不可做时考虑换角度……不如说是"方向"来 dp
    P4766
    首先的思路要参考 Day2 T3 ,考虑按时间从前往后朴素 dp ,但发现他多了一维 di ,不可做
    参考线段树分治的思路,发现按时间 dp 是困难的,我们试一试换个方向,从左往右按距离 dp ,这有什么好处呢?因为距离最远的外星人必须被炸掉,而如果他炸掉了必然会波及当前时间存活的所有距离近的外星人,而当前时间死亡的在上面区间处理,当前时间没有出现的在下面区间处理
    dpl,r 表示消灭出现时间和消失时间在 [l,r] 内的外星人全部消灭的炸弹距离和

  • n,m,a1an ,构造值域在 [0,2m) 的严格单增的 bi ,使最大化 ai×popcnt(bi)

    我们先像一个朴素 dp ,设 dpi,j 表示前 i 位,上一个 bi 值为 j 答案,复杂度 O(n2m)
    我们发现如果我们从前往后 dp ,因为 bi 单增,我们不可避免的要记录上一个 bi 的值。怎么办呢?我们考虑从左往右 dp
    这里从左往右是指把下标当做前后,bi 的值当成左右。既然有二进制当然考虑的是 bi 的二进制,发现在考虑第 j 位时,如果前 j1 位是相同的,则第 j 位一定是前面一段是 0,后一段是 1 ,这不就是一个区间 dp 了吗

  • 树形背包是 O(n2) 的原因:两个点 (x,y) ,只会在他们的 lca 合并一次,最多 O(n2) 个点

  • P7519 [省选联考 2021 A/B 卷] 滚榜

    先考虑如果你已经有了一个排列,怎么判断是否可行。显然的,bi 越小越好,因此贪心即可
    排列的第三种优化方法,朴素状压,记录 dpS,lst,lp,sumb 表示考虑了集合 S ,上一个 bi 最小为 lst ,上一个 plp ,所有 bi 的和是 sumb,复杂度 O(2nn2m2)

    老师曰:
    要想去掉 dp 的某一维有几种方法:
    1. 可以通过其他的数推出他的值
    2. 他产生的影响可快速计算
    3. 贪心性质,这一维没有必要

    这时候用的第二种方法。考虑整数划分的优化方法,发现如果一个位置 bi 限制了一个值,后面的都要限制住这个值,不如直接把这个值在后面减掉

  • a1an ,求多少 (i,j) 满足 (ai+aj)(ai2+aj2)K(modp)

    数学奥数题
    你拆开更难算
    有个东西叫平方差公式
    原式等价于 ai4aj4KaiKaj(modp)

  • P8555弱化版
    n5000

    这个题用的就是排列的第一种处理方法:考虑相对大小
    我们发现如果直接填数的话是困难的,因为你不知道前 i 个数填什么,因此我们考虑把一个数插入到某个位置,然后让这个位置后面的数 +1 ,这就是离散的状态设计方法
    我们设 dpi,j 表示前 i 个数中有 j 个数比上一个标记的数要大的方案数。可以知道 0jidpi,j=i! 。每次转移时,我们需要考虑ai+1 在原来的数中的排名

    • ai+1 比我们这次标记的数要大, dpi,j×jdpi+1,j
    • ai+1 比我们这次标记的数要小, dpi,j×(ij+1)dpi+1,j1
  • AGC032D
    这个问题很像CF1839D Ball Sorting
    考虑弱化版,若 A=B 怎么办,我们可以钦定里面一段上升子序列不变,剩下的移动。显然取 LIS 最优
    虽然 ABLIS 的性质显然不满足了,但我们可以知道基本思路。设 dpi,j 表示前 i 个数取以 j 结尾的上升子序列时答案,递推显然,复杂度 O(n2)

  • P8321
    min Or max 处理请去掉他们,因为计数是不能有这些东西的
    我们考虑把 a,b 合并后从大到小排序,我们就相当于找所有 ab 匹配,答案为两者靠后的一个
    这就很像P8863,我们设 dpi,j,k 表示前 i 个数, a 向后牵 j 根线, b 向后牵 k 根线,转移显然。发现我们可以优化掉一维,因为假如我们知道前 i 个数中 a 的个数为 Ab 的个数为 B ,则可知 k=A(B(ij))

技巧小节

  1. 利用容斥原理将全部满足转为钦定自己不满足
  2. 在合适的时间计算贡献以减少对后续状态的影响
  3. 以合适的方法排序以获得好的性质
posted @   FOX_konata  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示