OI题目类型总结整理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OI题⽬类型总结整理
本蒟蒻的⼩整理qwq~~持续更新(咕咕咕)
数据结构
数据结构——线段树
推荐yyb dalao的总结——
以后维护线段树还是把l,r写到struct⾥⾯吧,也别写len了,调试不好调qwq
初始化和叶节点初始化不太⼀样qwq,有的需要统⼀初始化的就⼀定注意不要写到if(l==r)⾥⾯qwq
求区间最⼤⼦段和例题:codevs动态最⼤⼦段和
维护区间和,区间前缀最⼤⼦段和,区间后缀最⼤⼦段和,区间最⼤⼦段和。
然后合并。
(注意这种跨左右⼦树还有可能会有贡献的线段树写法上和普通的线段树不同!)、
求区间最⼤连续⼦段(⽐如说求⼀个区间内最长0⼦段的个数)例题:SHOI脑洞治疗仪
维护区间前缀最⼤,后缀最⼤。
然后合并即可。
需要注意的⼀点是下⾯代码⾥⾯的取min(也就是带询问的区间更改⼀定要注意!前后缀长度是不能超过这个长度的):
if(rr<=mid) return query(ls(x),ll,rr);
else if(mid<ll) return query(rs(x),ll,rr);
else
{
int cur1=query(ls(x),ll,mid);
int cur2=query(rs(x),mid+1,rr);
int z1=min(t[ls(x)].maxr,mid-le[x]+1);
int z2=min(t[rs(x)].maxl,ri[x]-mid);
return max(max(cur1,cur2),z1+z2);
}
线段树模拟⽹络流例题:codeforces280div.1D
这是个神仙啊!!!主要⽬的是为了优化时间复杂度,就是考虑最⼤费⽤流怎么跑的,我们⽤区间反转模拟退流过程即可。
具体实现请看博⽂题解。
时间复杂度O(klogn)
⼀条链,两点之间有给出的距离,要求logn的时间复杂度内,求出⼀段区间中∑任意两点之间的距离和。
例题:HAOI⾼速公路
ans=∑r i=l a[i]∗(i−l+1)∗(r−i+1)
ans=∑r i=l a[i]∗(−i2+(r+l)i+(r−l+1−rl))
线段树维护即可
求历史最值(线段树模板3)例题:CPU监控
将操作转换成(a,b),表⽰最终结果为min(x+a,b)。
O(logn)时间复杂度求最长上升⼦序列的个数例题:BZOJ楼房重建
在N个区间中选K个,使得它们的区间交⾄少为1,求最长区间长度-最短区间长度的最⼩值。
例题:NOI区间
先按长短排序,再按尺取法,不⾜K个的时候就加⼊到线段树中,如果满了就弹出前⾯的。
⼀棵树,每个节点都有颜⾊,有权值。
⽀持对权值的更改,求树上某两个节点之间,拥有某⼀种颜⾊的节点的权值的最值或和。
例题:SDOI旅⾏树链剖分,动态开点,给每⼀个颜⾊都建⽴⼀棵线段树。
将⼀个长度为n的序列分为k段,使得总价值最⼤。
⼀段区间的价值表⽰为区间内不同数字的个数。
n<=35000,k<=50 例题:CF833B
转移⽅程——f[i][j]=max(f[k][j−1]+Calc(k+1,i)),然后线段树维护。
⼀张图分为两部分,左右都有n个节点,Ai−>Ai+1连边,Bi->Bi+1连边,容量给出
有m对Ai−>Bj有边,容量给出。
两种操作
1.修改某条Ai->Ai+1的边的容量
2.询问从A1到Bn的最⼤流
n,m<=100000,流量<=109。
线段树模拟⽹络流,转化成最⼩割——Ans=A i A i+1+B j+B j+1+A x B y(x<=i,y>j)。
A如何更改不会影响到B⼀⽅的最⼩割选择,所以我们扫⼀遍A,在B中插⼊相应的值就⾏了。
两种操作,⼀种是令⼀个区间升序排列,⼀种是降序排列,求最后第K位上的数字。
例题:TJOI排序
⼆分这个值,然后⽐他⼤的置为1,其他的置为0,然后⽤线段树维护操作,看最后那个数是1还是0.
两种操作,⼀种区间开⽅,⼀种区间加。
(数值不超过1e5)例题:UOJ基础数据结构练习题
区间开⽅转换成区间减维护。
区间开⽅
暴⼒即可
维护⼀个区间,两个操作
1.将区间[l,r]所有数变为C ai
2.求区间[l,r]\mod p的和
例题:六省联考相逢是问候
我们根据欧拉定理,知道反复进⾏若⼲遍操作之后,答案不会再变,所以提前预处理出所有的φ值。
同时记录区间最少的操作次数,如果最⼩操作次数达到了上限,直接return。
给你⼀个数列,两个操作
1.给⼀段区间加上⼀个等差数列
2.将⼀段区间分解为最少个数的等差数列,输出等差数列的个数
例题:BZOJ1558等差数列
我们考虑对数列做差,这样如果是等差数列,那么值应该相等。
我们设s[0],s[1],s[2],s[3]分别表⽰当前区间中,不考虑两端、不考虑左端点、不考虑右端点、两端都考虑,形成等差数列的个数。
扇形⾯积并,求被⾄少K个扇形覆盖的范围例题:SHOI2013扇形⾯积并
转换成矩形,⽤线段树维护即可。
数据结构——线段树——线段树合并
⼀般线段树都是权值线段树,我们对权值线段树进⾏合并。
数据结构——线段树——李超线段树
放上⾃⼰的
数据结构——主席树(可持久化线段树)
静态区间第K⼤模板
带修区间第K⼤例题:BZOJ1901
树状数组套主席树,主席树不需要继承历史版本,它的前缀和⽤树状数组维护了。
链上第K⼤例题:BZOJ2588
平常的主席树是利⽤前缀和然后做差,现在放到树上就是树上差分。
但是继承的时候注意要把继承上⼀个节点变成继承⽗亲的。
然后⽤树上点差分即可。
数据结构——树链剖分
维护链上有向信息,如有向最⼤差例题:TJOI2015旅游
就是维护前缀最⼤差,后缀最⼤差以满⾜有向的限制。
最⼤差有两种选择⽅式。
如果有节点修改,修改过的节点随着操作次数增加依然增加,然后求两个点之间⼩于等于K的节点个数。
例题:SCOI情报传递
套主席树,但是操作过程中进⾏主席树上修改显然没有刚开始就离线处理得好。
每个节点都有⼀个颜⾊,求两点之间不同颜⾊段数(⽐如说11122113就是四段)
额外记录⼀个该区间最左端和最右端的颜⾊即可。
(如果不是节点有颜⾊,是边有颜⾊呢?)
数据结构——LCT
改变树的结构,记得要push_up。
查询的时候⼀定要先push_down。
维护链信息(LCT上的平衡树操作)
动态维护连通性&双联通分量
如果是动态加边,⽤并查集维护会⽐findroot更快qwqwq
⼀定要注意有没有环出现!!!
维护边权(常⽤于维护⽣成树)
维护⼦树信息
维护树上染⾊联通块
数据结构——平衡树
为了让序列连续,我们可以将⼀般的splay插⼊的极⼩值(-2147483647)变成1,极⼤值(2147483647)变成n+2.
当⼀个数可能会对应很多意义(⽐如说⼈名?)就不要合并到⼀个节点⾥⾯了,分开建节点!
数据结构——左偏树
合并,求最值例题:APIO2012派遣
维护⼦树信息(和其他树⼀样,维护add,mul标记,有push_down)例题:JSOI城池攻占
数据结构——莫队
数据结构——莫队——普通莫队
⼀般都是对于计算出来区间[l,r]的值之后,能在O(1)或者差不多的时间中快速计算出[l+1,r],[l-1,r],[l,r-1],[l,r+1]的问题。
给定⼀个序列,询问⼀个区间内不同数字的个数。
数据结构——莫队——带修莫队
先离线所有的操作,然后标记上修改的时间戳,还按照普通莫队做。
如果当前处理的询问在上⼀个处理的时间之前,就还原之前的所有操作,如果在之后,就先进⾏之后的所有操作。
数学
数学——裴蜀定理
\begin{cases}(n+m)a+(p+q)b=x\\(p-q)a+(n-m)b=y\end{cases}
n,m,p,q为未知解,求是否存在整数解?例题:HAOI向量
注意还需要进⼀步分类讨论n+m,n-m,p+q,p-q的奇偶性。
数学——欧拉定理(拓展欧拉定理)
给定n,每次使n等于φ(n),求最少⼏次操作后n=1。
例题:HAOI外星⼈
求出有多少个数作为因⼦即可。
数学——莫⽐乌斯反演
求gcd(i,j)=k,i\in[a,b],j\in[c,d]的个数要求O(N)
求\sum_{i=1}^n\sum_{j=1}^md(ij)要求O(N\sqrt N)
数学——莫⽐乌斯反演——公式与技巧
i\in[1,n],j\in[1,m]\;then\;d(ij)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1]
\sum_{i=1}^n\lfloor\frac{m}{k}\rfloor[x|gcd(i,j)]=\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\lfloor\frac{m}{xk}\rfloor
求\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor——整除分块
数学——BSGS
⼀般⽤来在\sqrt N的时间内,解决对于y^x\equiv z\pmod p,给定y,z,p求x的问题。
数学——矩阵树定理
注意不合法的情况不需要给它赋id,直接跳过即可。
数学——容斥
ans=⾄多有n个-⾄多有n-1个+⾄多有n-2个......(奇加偶减)
求⼀个区间内(范围1e10)只包含数x,以及这些只包含数x的数的倍数的个数。
例题:SCOI2010幸运数字
先处理出来只包含数x的数都有哪些。
lcm(i)表⽰是其中i个数的lcm。
ans=lcm(1)-lcm(2)+lcm(3)......
给定⼀个序列,每次只能删除⼀个数,删除到这个数列⾮降为⽌,问⼀共有多少种删法?例题:BZOJ4361 isn
有障碍的⽹格图计数
对于⼀个确定的点(x,y),⾛到它的路径条数为C_{x+y}^x。
递推公式——dp[i]=C_{x[i]+y[i]}^{x[i]}-\sum_{j=1}^{i-1}dp[j]\times C_{x[i]-x[j]+y[i]-y[j]}^{x[i]-y[i]}
对于n个条件,⼀个都不满⾜的sum=sum(随便放/总数)-sum(⾄少满⾜其中1个条件)+sum(⾄少满⾜其中2个条件)-sum(⾄少满⾜其中3个条件)......
lucas定理
在O(n\sqrt n)的时间中快速计算f[n][k]=\sum_{i=0}^kC_n^i\pmod {2333}
=C_{n/p}^0\times \sum_{i=0}^{p-1}C_{n\%p}^i+C_{n/p}^1\times \sum_{i=0}^{p-1}C_{n\%p}^i+...+C_{n/p}^{k/p-1}\times \sum_{i=0}^{p-
1}C_{n\%p}^i+C_{n/p}^{k/p}\times \sum_{i=0}^{k\%p}C_{n\%p}^i
=\sum_{i=0}^{p-1}C_{n\%p}^i\times(C_{n/p}^0+C_{n/p}^1+...+C_{n/p}^{k/p-1})+\sum_{i=0}^{k\%p}C_{n\%p}^i
=\sum_{i=0}^{p-1}C_{n\%p}^i\times \sum_{j=1}^{k/p-1}C_{n/p}^j+\sum_{i=0}^{k\%p}C_{n\%p}^i
=f[n\%p][p-1]\times f[n/p][k/p-1]+C_{n/p}^{k/p}\times f[n\%p][k\%p]
图论
图论——⽣成树
图论——⽣成树——kruskal⽣成树
例题:NOI2018归程\;peaks加强版
对于⼀个图,执⾏有关于从某个点出发的第⼏条⼩/⼤的边,或者从某个点出发⼩于/⼤于x的边不计算相关问题,强制在线。
图论——欧拉回路
给出⼀个有向图,问⾄少删掉多少条边使得这个图有欧拉回路。
设p_i=in[i]-out[i],如果p_i,从S连向i,否则i连向T,容量为|p_i|。
然后⼀条有向边(u,v),⽹络刘忠
图论——基环树
对于⼀个n点n边的图,如果途中只存在⼀个环,则称之位基环树。
细分则有基环树,基环内向树,基环外向树。
⼀般解决⽅法都是树形DP,然后对环部分进⾏环形DP。
不然可以考虑断环法。
例题:NOIP2018旅游
例题:ZJOI2008骑⼠
例题:IOI2008island
图论——分层图
在⼀张图上移动,但是在相同的坐标位置因为其他⼀些条件的约束,有不同的状态。
图论——⽹络流
图论——⽹络流——最⼤流
常⽤建图模型1:对于⼀个点多种状态的(⽐如说在不同时刻状态意义不⼀样),可以把这个点拆成n个点,来分别表⽰不同时刻的状态。
询问最⼤流的⼏种⽅案中最长边的最⼩值例题:SDOI费⽤流
⼆分+限流跑dinic
在n \times m的矩阵中取出 n 个不同⾏且不同列的数,求取出的 n 个数中第 k ⼤的最⼩值。
例题:SCOI2015 ⼩凸玩矩阵
转换求最⼤数的最⼩值,⼆分⼀个值,只要有n-k+1个数⼩于等于它即可。
考虑⽹络流求最⼤匹配。
S向⾏连边,列向T连边,如果某个数字⼩于等于⼆分的值,将它的⾏列连边。
图论——⽹络流——最⼩割
⼀般都是最优化问题的决策问题的解决利器。
很多题⽬利⽤总点权(或者说所有正权点的和)-最⼩割来解决问题。
qwqwq
最⼤权闭合⼦图模型
出现环怎么办。
缩点,给每个强连通分量⾥⾯的点都连⼀条-inf的边到T。
(NOI植物⼤战僵⼫)
切糕模型(给定⼀个⽴⽅体,它被分成p q r个格⼦,每个格⼦中都有⼀个数字,相邻地选择数字,每⼀⾏每⼀列都要选择⼀个数字。
要求这些数字和最⼩。
)
建r+1层,然后这些边的权值是对应位置的数字权值。
从每⼀个点(第z层)向它旁边四个纵轴连⼀条指向第z-d层的有向边带组合的决策问题(给定n个点,每个点放进集合A有收获,放进B有对应收获,⼀些点组合起来⼀起放进A或B有额外收获,问最⼤收获?)如果处理额外收获?最⼩割,割掉表⽰不选。
每个组合建对应集合个的新点,新点连对应集合的点INF。
如果是问最⼩收获?直接把取值反成n-ci按原来的求,之后答案再还原⼀下即可。
⽅格中有节点,每⼀个节点和周围的⼀些点不能共存,现在计算最多可以选出多少个节点。
权值为1的最⼤点权独⽴集——总权值-最⼩割。
平⾯图最⼩割=对偶图最短路(降低复杂度)
图论——⽹络流——费⽤流
⼀张图,起点是1,终点是n,问起点到终点再从终点到起点,每个点只能被访问⾄多⼀次,问⼀来⼀回最多能经过多少节点。
例题:航空路线问题⼀来⼀回==从起点出发两次。
最⼤费⽤流,拆点,中间流量为1,费⽤为0,强制u+n向v连边。
但是要注意的是,有可能最佳⽅案是从1到n然后再到1,所以不能对于每条可⾏的线路的容量设置为1,因为这样的话就再也⽆法回来了qwq。
早上订货,可以定很多,每天早上的每单位的货有⼀个可能不同价格。
每天必须保证⾄少x的供应量,货可以囤积到之后的天,但是量不能超过s,⽽且每单位需要⽀付⼀定的价钱p。
裂点,分成早晚两个。
S向早上连容量INF的边,早上向T连容量为供应量,费⽤为0的边。
早上向晚上连容量s的边,晚上向次⽇早上连容量s,费⽤为p 的边。
最⼩费⽤最⼤流。
如果是⼀条边只能取⼀次,就连⼀条容量为1,费⽤为收益的边,再连⼀条容量INF,费⽤为0的边。
如果是⼀条边的费⽤为诸如容量^2\times收益的这种不好计算的,考虑拆边,统⼀容量为1。
注意⽹络流⼀定不要因为数组开⼩⽽GG!!⼀定⼀定要注意边的数量,开够数组!!!
图论——其他
动态规划
动态规划——背包
动态规划——树形DP
每⼀个数都有⼀个⽗亲,必须⾃⼰的⽗亲先安装才能安装⾃⼰。
每⼀个数安装都有安装所需空间和获得效益,现在给定最⼤可⽤空间,求最⼤效益。
例题:HAOI2010 软件安装
可能成环,要么全装要么⼀个不装,所以先tarjan缩点,注意缩点之后把缩得的点连上这个环⾥⾯其他点连出去的边。
然后就是⼀个树,做树形DP即可。
动态规划——树形DP——虚树优化
保留有效信息(如询问点和LCA),⼀般都出现在有询问点总和的条件约束的题⽬中。
动态规划——区间DP
给定⼀个序列,可以删除⼤于1长度的,连续的,形成等差数列的数,删完之后两边拼合,求最后最少能剩下多少个数?
⽆论怎么删,总是能拆成删若⼲次两个的+若⼲次三个的。
所以区间DP+分类讨论即可。
n个数,对于每⼀个数i,有ai个数⽐它⼤,有bi个数⽐它⼩,可能有相同数出现。
问最⼩的不合法约束数量?例题:HAOI problem a
做⼀个转化,每⼀个数的约束条件都是⼀个区间,这个区间内他们的数值都相同。
每个区间都有⼀个权值,然后线性地DP即可。
不过注意⼀个区间内最多有min(对应区间为此的数的数量,r-l+1)。
动态规划——区间DP——有决策点的DP
已知[1,x]区间⾥有东西,每次可以从[1,n]区间中以a[i]的代价询问该点是否有东西,求最坏情况下能确定x所需要的代价?例题:挖油,要求O(N^2)区间DP+优化。
主要是⽤优先对列将其从O(n^3)优化到O(n^2),⽤n+1个优先队列维护该点状态主要从哪⼀种(作为最坏的)转移⽽来,1个维护固定左端点的,每次更换枚举的i时清空。
n个维护固定右端点的,⽆需清空。
动态规划——DP套DP
某些DP问题的⼦问题不能简单地解决,⽽必须⽤另⼀个DP解决的问题。
即:外⾯的DP的状态是存的⾥⾯的DP各个状态的值,利⽤⾥层的状态来判断外层的DP是否合法,类似的问题有LCS为定值的序列的⽅案数等等。
-例题:hero and devil
动态规划——DP优化——单调队列
动态规划——DP优化——单调栈
动态规划——DP优化——矩阵加速
动态规划——DP优化——决策单调性
动态规划——AC⾃动机上DP
其实可以把AC⾃动机看作⼀个DAG,所以这个也就是DAG上的DP问题了。
给定⼀个数n,以及⼀些模式串⽐如说“123”(都没有前导零)。
问从1到n的数中有多少个数的⼗进制表⽰中没有出现任何⼦串为给定模式
串?n\le10^{10^{18}},m\le10
AC⾃动机上DP+矩阵快速幂优化递推
上⼀个问题,有前导零。
n\le2e5,m\le 200例题:SDOI数数
分成⼀类为没有长度限制的(即长度在n的长度以内的),⼀类为长度正好为n的,然后⼜分两种,⼀种是当前位已经达到限制,⼀种是还未达到限制。
递推转移即可。
动态规划——其他
快速约瑟夫环
我们知道约瑟夫问题的通式⼀般都是这个样⼦的——dp[i]=(dp[i-1]+k)\mod i,时间复杂度是O(n)的。
但是如果我们想要O(logn)的做法呢?如果f[i-1]+k不超过i的时候,我们可以⼀次多加⼏个。
⼀个n*m的矩阵,可以选择其中⼀个数字进⾏修改(当然也可以不修改),求最⼤/最⼩矩阵和。
记录⾏/列最⼩值/最⼤值⽅便替换,记录⼀个不修改的最⼤/最⼩矩阵和和⼀个带修改的最⼤/最⼩矩阵和。
⼀个n*m的矩阵,可以选择其中⼀个数字进⾏修改(当然也可以不修改),使得矩阵的最⼤⼦矩阵尽可能⼩。
DP+分类讨论
最长公共⼦序列的长度和最长公共⼦序列的个数。
例题:HAOI2010最长公共⼦序列
长度很好做.len[i][j]=max(len[i-1][j],len[i][j-1]),if(a[i]==b[j]) len[i][j]=len[i-1][j-1]+1
个数则sum[i][j]+=sum[i][j-1]+sum[i-1][j]
if(len[i-1][j-1])+1==len[i][j]then\;sum[i][j]+=sum[i-1][j-1]
if(len[i-1][j-1]==len[i][j]then\;sum[i][j]-=sum[i-1][j-1]
坐座位,每个⼈都有⼀个编号,⼤家按照次序进⼊,从⾃⼰的编号开始做,如果位置被占了就顺次向后移动,直到找到⼀个空座位为⽌。
事先有些⼈的为⽌已经预定过了不能更改。
现在要给没有预定座位的⼈赋编号,问有多少种⽅案?例题:HAOI problem c
显然编号确定了之后,坐座位的序列就是唯⼀的了,所以我们要给不同的⼈安排编号来使得⽅案不同。
设dp[i][j]表⽰第i个⼈之后,除去那预先预定过座位的⼈,我们给j个⼈制定了座位。
dp[i][j]=dp[i+1][j-k]*C_j^k,时间复杂度O(n^3)。
最短路上DAG计数(这⾥指经过边的计数)例题:HAOI道路
先拓扑排序,然后按照次序正着DP⼀次,反着DP⼀次,乘起来即可。
字符串
字符串——哈希
字符串——KMP
字符串——manacher
字符串——AC⾃动机
⼀般AC⾃动机是解决字符串匹配⼀类的问题。
求⼀些模式串(不重复)有没有在⽂本串中出现过
求⼀些模式串(不重复)在⽂本串中出现多少次?最多的是哪个串?
求⼀些模式串(有重复)在⽂本串中出现多少次?例题:TJOI单词n\le200,模式串总长度\le1e6
暴⼒跳fail肯定会T,所以我们按dfs序从后往前遍历,往⾃⼰的fail边指向的节点累加答案。
求有没有可能存在⼀个⽆限长的串,使得其中不包含给定的⼀些⽂本串——也就是说不存在⼀个串,⽆法匹配给定的这些⽂本串。
尽可能让模式串匹配。
有fail指针就要往上⾯跳。
可以证明如果存在这样⼀个串,那么加上fail边,AC⾃动机上⼀定会出现⼀个环。
字符串——SA后缀数组
字符串——SAM后缀⾃动机
后缀⾃动机⼀般都⽤于解决什么样的问题呢?
求⼀个⼦串不同⼦串的数量。
也就是\sum longest-shortest+1=\sum longest-parent.longest
求两个字符串的最长公共⼦串。
计算⼏何
计算⼏何——凸包
计算⼏何——动态凸包
例题:HAOI防线修建
计算⼏何——最⼩圆覆盖
其他技巧
曼哈顿距离⼩于等于d的菱形可以通过更改坐标系(旋转45度)使其变成矩形。
例题:BZOJ极光
求满⾜l_i\le L或者R\le r_i的i的数量,可以转化为以L,R为原点,求坐标在第⼆象限的点的个数,可以⽤线段树扫描线来做。
例题:ARC exhausted?
异或——异或⼀个数两次,就相当于没有对这个数进⾏操作。
对于⼀个区间[l,r],我们设a[i]为前i个数的异或和,显然对于区间[l,r],a[l-1]^a[r]就是这个区间⾥⾯所有数的异或和。
⼆分,⼀般都是⽤来转化成判定性问题来简化问题的,或者出现“最⼤值最⼩”,“最⼩值最⼤”之类的字眼。
对于⼀个数x,区间[A,B]内它的倍数是⌊Bx⌋+⌈Ax⌉+1
环上问题⼀般都是断环为链,复制两倍
链上⼀个接⼀个的转移显然可以⽤倍增优化
尺取法(维护两个指针,以O(n)时间复杂度解决⼀类单调性问题)
--
⼀些读题上的问题
注意⼀些“请问在字符串A中字符串B出现了多少次,这些出现的位置只要有任何⼀个不⼀样就⾏了,所以⽤.find的时候pos+1⽽不是pos+length(B)问第K⼤,就真的是从⼤到⼩第K个数!!
Processing math: 21%。