SDSC笔记

SDSC笔记

Day1

图论杂讲

联合权值:枚举中转点 O(n)

关押罪犯: X 为自己, X 为对面,按照怒气值排序,每次把 XY 以及 YX` 合并,出现冲突就退出。

食物链: 类似关押罪犯,X1 为自己,X2 为食物,X3 为天敌。

车站分级: 每辆车会给车站带来一个大小关系,把未停靠向已停靠的车站连边,拓扑排序的时候dp,暴力连边 O(n2m) ,引入辅助点时间复杂度 O(nm)

BZOJ 2563: 把边权分到两个点权上

运输计划: 二分最大值,剩下不满足条件的边用树上差分来记录边有多少路径,每条为 k 条路径经过的边枚举一下删哪条边。

CF1349C:ci,j 为这个时刻进入大小大于 1 的连通块,每个连通块向外扩展大小为 1 的连通块

CF209C: k 个连通块用 k1 条边连起来,选度数为奇数的点相连,特判整个是连通图,如果连通块里没有奇点就浪费一条边连。

CF1311E: 构造出完全二叉树,每次把点扔到最长的一个链上。

华容道: f(i,j,k) 表示棋子位于 (i,j) ,空格位于四周哪个位置,预处理状态之间的转移,让空格bfs到另外三个点,连边,直接和空格交换连边,跑bfs,复杂度 O(n2m2+qnmlog(nm))

CF875F:一个公主看做一条边,答案形成若干个基环树,求整张图的最大生成环套树,kruscal,给并查集加一个标记,对于每条边,看是树还是基环树,连边即可。

BZOJ 2238:如果边不在最小生成树上,答案无影响。如果是树边,等同于求跨过这个树边的非树边最小边权值。边权从小到大排序,每次把未被标记的点打上标记,并查集维护某个点上方第一个未被标记的点。

HDU 5215: 判断奇环就是判断是否为二分图,判断偶环:建出dfs序树后,如果两个点之间有返祖边并且深度之差为奇数就是偶环,深度之差为偶数就是奇环,如果两个奇环相交则可以形成一个偶环(删掉相交部分)。判断相交可以暴力打标记,因为每条边最多遍历到一次。

ICPC2018 青岛站 F:

n 个人,进行 k轮决斗,每一场决斗两两匹配,对于两个人比赛中最多决斗一次。若存在四个人 a,b,c,dab 在第 i 轮决斗,cd 在第 i 轮决斗,ac 在第 j 轮决斗,则 bd 必须也在第 j 轮决斗。

构造一组方案,无解输出 Impossible。

k 可行则 k1 也可行,相当于给定 n ,问最多决斗多少轮。k为二进制n最后几个0,2k1轮。

CF1335F: 内向基环树

CF1344C

CFGtm 100269K

Makoto SOejima's Contest 4

CF1340D

Day2:

线段树:

维护数列,区间赋值,区间求和,区间做按位与: 每一位的答案都是独立的,所以给每个二进制位开一棵线段树,区间推平/求和即可。做法类似我之前写的一篇博客的Part3部分

维护区间数的种数(离线)(HH的项链):区间 r 排序,对于每个 rvr=1,vprer=0 对于每个 l 区间求和即可。

n 个正数和 m 个区间,要求选出恰好 k 个区间,交集内数字和最大

二维数点: 可以利用差分变成询问下界为 0 的矩形,每次 y++ 相当于把小于等于一个 y 的点拍到x轴上,询问下界为 0 的矩形就变成了询问区间和。

n 个球排成一列,每个球有一个颜色,每种颜色有一个价值,选定一个区间,使得所有在这个区间中出现恰好一次的颜色的价值之和,范围1e5:

prex 为颜色上一次出现,nextx 为下一次。则 prex<lx,xr<nextx,则可以看成 二维平面上 prexxxnextx 的矩形值加上一个值。就变成若干矩形加求一个点的最大值,扫描线即可。

多组询问序列中的区间MEX: 对于 x (所有的 x ,并不是非在 a 中出现)出现的每个位置,则 prelrx 的区间要考虑答案是否为 x ,取 min ,变成矩阵上扫描线,每次拍点最小值。

李超树: 平面直角坐标系,每次加入一条直线,求交点。

区间开根,区间求和: 一个数 x 最多只会被开 loglogx 次,只需要维护区间最大值,看是否为1,不是就暴力开,如果是1就没必要再开,直接退出即可。

区间取模,区间求和: 一个数 x 变成 xmodp 是严格小于 x2 的,所以最多只会被开 logx 次,同上暴力即可。

主席树(可持久化线段树)

扫描线强制在线: 用主席树维护,每次拍一个点建立一棵新版本线段树,每次询问前缀区间相当于在历史版本上进行区间查询。

静态区间第 k 小: 可持久化值域线段树(线段树维护桶),每次令 b[a[i]]+1,形成一个新的版本,(线段树维护 b ),求第 k 小每次询问区间的二分后的值的排名,根据和 k 比较的结果向下递归。

n 个帽子,一个帽子下有球。m 个操作序列,每个操作形如交换两个帽子。多组询问 l,r,x ,表示一开始球放进 x 个帽子里,执行 lr 到操作后球在哪里。ai 表示经过 [l,r] 区间后 i 到哪儿,bii[1,l] 区间交换前的位置。主席树把 a,b 可持久化,查询 a[b[i]]

线段树优化建图

线段树分治

Day3

网络流三种最基本的类型为最大流、费用流、最小割。

网络流的难点在于建模,建模后上模板就可以求解。

抽象模型: 流水管道模型

源点(S)和汇点(T),有向图,每个节点之间有个管道有容量,从 S 出发释放水,传到 T

最大流

最大流即为从 ST 最大能流到多少水。

定义: 网络: 有向图 (V,E) ,指定源点 S 和汇点 T,每条边给定容量 c

边的流量,每条边的流量变量f满足 0fc

流量平衡: 除 S,T 外,点流入的流量等于流出的流量。

网络的流量: S 流出的流量也等于 T 流入的流量。

求最大流:

建反向边,流量为正向边流量的相反数,流水的时候每次选一条没有流满的路径,尽量将其流满,找不到这样的路径为止。

Dinic:

只要网络中还有通路,就按到 S 的距离分层,在保证流量只从第 i 层流向 i+1 层的前提下(变成一个拓扑图),尽可能增加流量。

理论最差复杂度 O(n2m)

Dinic做二分图匹配的复杂度为 O(n0.5m)

二分图最大匹配(网络流):

建立一个源点 S 连向一侧所有点,另一侧所有点连向 TST 的最大流即为最大匹配。(容量都为 1

飞行员配对方案: 二分图最大匹配模板

POJ3281 Dining 保证牛只被匹配一次,拆一下点: S->食物->牛1->牛2->饮料

假期的宿舍: 每个床看做一个点,每个人看做一个点,题目即为人和床的二分图匹配,最大流看是不是所有人都能匹配到床

星际战争: 二分答案 t ,源点流向武器 bit,武器流向机器人 inf,机器人流向汇点 ai ,判断最大流是否为 ai 即可。

紧急疏散: 二分答案 k ,TLE想法: 分层图,每个相邻空地向下一次连一条 inf 边,每个时刻的门都向汇点连一条 1 边,源点向第一层空地连 1 边,空地向相邻门连一条 1 边。正解: 对于每个门都会产生 k 个出门的机会,求出每个人到每扇门的距离后,即可知道每个人能选择哪些机会,二分图匹配判断是否每个人能分配到一个机会。

考虑优化: 每个门向下一个时刻连 inf 边,每个人向他能拿到的第一个机会连边。

费用流:

给定一个网络,给每条边一个费用 w ,若流量为 f ,则需要费用 wf

最小/大费用流

最小/大费用最大流

费用流做法: 按费用找一条 ST 的最短通路,将这条路径尽量跑满,如此重复。反向边的费用为该边费用的相反数。

分配问题: 二分图最大权值,最大/小费用最大流即可。

网络扩容: 第一问最大流模板,第二问边连费用0流量c,再连费用k容量inf最小费用最大流。

订货: 源点(进货) 向每个月连容量 inf 费用 di ,每个月向下一个月连容量 S 费用 m ,每个月向汇点(卖货)连容量 Ui ,费用 0 ,跑最小费用最大流。

球队收益: 有几场比赛就连几条边,其中费用是剩余 i 场时支持的差值,是递增的,所以一定是选前几条边。

最小割

给定一个网络,删掉一条边的代价就是这条边的容量,要求删掉一些边使得 St 不连通,求最小代价。

定理: 在数值上最小割=最大流。

狼和羊的故事: 所有羊看做一个源点(超级源点流向所有羊无穷),所有狼也是看做一个汇点(流向超级汇点无穷),能到达的点之间连边,流量1,跑最小割。

善意的投票:S和T代表睡觉和不睡觉,好朋友之间连1的边,小朋友向自己的主见连1的边。

能量魔方

Day4

单调数据结构优化

fi=mink=b[x]x1{g[x]}+w[x]

满足 jk 并且 gkgjj 毫无用处了,所以只需要单调队列优化达到均摊 O(n)

多重背包:

f[i]=mini=0c[k]{f[xiw[k]]+iv[k]}

这个转移很麻烦,因为状态都不是连续的,考虑到一个状态能转移到的状态下标模 w[k] 都相同,那么在模 w[k] 相同的状态内,决策区间是连续的。

h(x,y)=f[xw[k]+y]

那么

h(x,y)=mini=xc[k]c[k]{h(i,y)+(xi)v[k]}

为什么呢?换成之前的把 h 替换成 f 就很显然了。

f[xw[k]+y]=mini=xc[k]c[k]{f[iw[k]+y]+(xi)v[k]}

其中 xc[k]c[k] 不变的情况下单调不降,可以转化成前面的模型。其时间复杂度为 O(nm)

例题: [NOI Online #3 入门组]买表

Luogu P3572 Little Bird

f[i]=minj=ikif[j]+[a[j]<a[i]]

i<jfi>fj 并且 ai<aj 显然 i 不可能比 j 更优,就弹出单调队列,于是以 f 为第一关键字,a 为第二关键字,单调队列维护即可。

SCOI2020 股票交易

f[i][j]i 天有 j 股股票。

fi=max:

f[i1][j]

f[iW1][k]ai(jk),max{0,jci}kj

f[iW1][k]+bi(kj),jkminK,j+di

后两个式子单调队列优化。

化简一下:

f[iW1][k]aij+aik,对 f[iW1][k]+aik 为关键字单调队列优化。

f[iW1][k]+bikbij,对 f[iW1][k]+bik 为关键字单调队列。

斜率优化:

HNOI2008 玩具装箱:

fj 表示前 i 个玩具,装在任意多个容器花费的最小费用,枚举上一个分组的分界点,可得:

f[i]=minj=0i1{f[j]+(sum[i]sum[j]+ij1L)2}

si=sum[i]+i,L=L+1

f[i]=f[j]+(sisjL)2

f[j]+(sj+L)2=f[i]si2+2si(sj+L)

yj=f[j]+(sj+L)2,xj=2(sj+L),ki=si,bi=f[i]si2

上式变成了

yi=kixj+bi

(xi,yi) 且斜率 ki 的直线,选择合适的 xi,yi 求最小截距。

(xi,yi) 滑到平面直角坐标系上(黑点),搞出下凸包,用斜率为 ki 的直线向上平移,直到经过一个黑点,此时的截距就是最小截距。

相邻黑点的斜率 ki 是递增的,每加进去一个点,用单调队列维护下凸包。

每条直线的 ki,xi 是上升的,所以单调队列下凸包上的点。

(维护线段斜率的过程)

JSOI2011 柠檬:

性质:分的每一段的首尾元素一定相同,且为选出的元素。

证明: 如果某一段不选首尾位置的元素,那么把首尾元素的位置划到别的短或者新开一段答案肯定不会差

f[i]=max1ji,aj=ai{f[j1]+ai(s[i]s[j]+1)2}

化简后得

f[j1]+ai(s[i]1)2=f[i]aisi2+2aisi(s[j]1)

因为转移的必要条件为 ai=aj,所以 ai 看成常数即可。

所以 yj=f[j1]+ai(s[i]1)2,xj=2ai(s[j]1),kj=si,bi=f[i]aisi2

转化成了 yj=kixj+bi

要求的是截距最大值,要维护上凸包,斜率 xj 对于每个 ai 是单调递增的,所以是从前往后取,取在上凸包最后的点,用单调栈维护 O(n)

四边形不等式

f(l,r)=mink=lr1{f(l,k)+f(k+1,r)}+w(l,r)

直接转移 O(n3) ,当 w(l,r) 满足某些性质时可以优化。

  1. 区间包含单调性: llrr

  2. 四边形不等式: l1l2r1r2 均有 w(l1,r1)+w(l2,r2)w(l1,r2)+w(l2,r1)

性质: 若 w(l,r) 包含单调性和四边形不等式,则 f(l,r) 也满足四边形不等式。

定理1: 若 f(l,r) 满足四边形不等式,设 ml,r 为最优决策点下标,则有 ml,r1ml,rml+1,r

所以在计算 f(l,r) 的同时将其最优决策点 ml,r 记录下来,每次转移枚举 [ml,r1,ml+1,r] 内的决策点即可。

枚举次数为 l=1n1r=l+1n(ml+1,rml,r1)=i=1n(mi,nm1,i)n2

石子合并:

f(l,r)=mink=lr1{f(l,k)+f(k+1,r)}+s(l,r)

s(l,r)[l,r] 内石子之和。它满足区间包含单调性,四边形不等式。

另一种四边形不等式优化:决策单调性优化:

f(r)=minl=1r1{f(l)+w(l,r)}

w(l,r) 满足四边形不等式时可以优化。

定理: 若 w(l,r) 满足四边形不等式,对于 r1r2k1,k2f(r1)f(r2) 的最优决策点,则有 k1k2

使用分治的思想,知道了 mid 的决策点 kmid ,根据决策单调性,对于所有的 x<mid ,f(x) 的决策点一定 kmid 反之一定 kmid。所以采用分治的思想,记录每个区间的决策点的上下界。可以在 O(nlogn) 的复杂度解决问题,即为决策单调性优化。

POI2011 Lightning Conductor & JSOI2016 灯塔

pi=maxj=1i1{hjhi+|ij|}=minj=1i1{hj+hi|ij|}

w(l,r)=|ij|

w(l,r) 满足四边形不等式。

ZJOI2010 基站选址

f[i][j] 为第 i 个放基站,前 i 个村子共放了 j 个基站,枚举上一个放基站的位置 k ,则dp方程为

f[i][j]=mink=0i1{f[k][j1]+ci+cost(k,i)}

cost(k,i) 表示在 ki 放基站且中间不放基站的情况下 ,[k,i] 之内的所有村子赔偿费之和。

对于每个村庄,预处理出 l[x],r[x] 表示能够覆盖到 x 这个村庄的最左端与最右端基站的位置。那么此村庄会对 cost(a,b) 产生贡献当且仅当 l[x]>ar[x]<b

从小到大枚举 j ,从 f[][j1] 更新到 f[][j]

从小到大枚举 i,使用线段树维护 f[][j1]+cost(,i) ,初始时,线段树上每个位置为 f[][j1]

更新 f[i][j] 时,先从线段树 [1,i1] 查询最小值再加上 ci 作为 f[i][j],对于所有的 r[x]=ix 在线段树上对区间 [1,l[x]1] 进行区间加 wi,之后枚举下一个 i 。由于每个 x 至多被枚举到一次,所以对于每一个 j 线段树的操作是 O(n) 级别的。

时间复杂度 O(nKlogn)

Day5

扩展欧几里得

ax+by=gcd(a,b) 的一组正整数解。

欧几里得定理: gcd(a,b)=gcd(b,amodb)

假设已经知道了 bx+(amodb)y=gcd(a,b) 的一组正整数解。

将其与 ax+by=gcd(a,b) 联立,得
ax+by=bx+(aabb)y
=bx+ayabby
=ay+b(xaby)

所以不断往下递归,直到 b=0 时,可直接解得 x=1,y=0

求乘法逆元:

若存在正整数 a,b,p,满足 ab1(modp),则 ba(modp) 意义下的乘法逆元。

以上同余方程可化为 ax+py=1x 即为求得的 b

根据裴蜀定理,该方程有解的充分必要条件是 gcd(a,p)=1 即为 a,p 互质。

时间复杂度 O(loga)

p 是质数的时候,有费马小定理 ap11(modp),在 O(logp) 复杂度内求出。

中国剩余定理:

{xai(modm1)xai(modmi)...xak(modmk)

当题目中的模数不是质数的时候,可以分成质因子分别求解后用中国剩余定理合并。

扩展中国剩余定理:

NOI2018 屠龙勇士

BSGS,离散对数问题

形如 abc(modm) 的同余式:

  1. 已知 a,bc :快速幂。

  2. 已知 a,cb : 离散对数问题。

  3. 已知 b,ca : 高次剩余问题。

现在讨论离散对数问题。

离散对数问题到现在为止并没有完全解决(因为没有多项式时间复杂度)

BSGS 算法:

主要运用分块的思想,处理 abc(modp)ap 互质的情况。

b=km+i,m 是设定的一个常量,一般取 p

此时有 akm+ic(modp)aicakm

对于 i[0,m) ,将所有的 ai 预处理出来存到一个 map (Baby Step)

从小到大枚举 k ,在 map 里面查找是否存在 cakm(Giant Step)

时间复杂度 O(plogp)

SDOI2011计算器

SDOI2013随机数生成器

原根

欧拉定理: 若 a,p 互质,则 aφ(p)1(modp)

如果 φ(p)ax1(modp) 的最小正整数解,则称 a 是模 p 的一个原根。

原根是非常类似于复数单位根,故有一些很好的性质,当 p 是质数的时候,原根有如下等价定义。

如果 g 是模 p 的一个原根,则 g1,g2,g3....gp1 在模 p 意义下两两不一,同时注意到模 p 剩余系只有 0...p1p 个数,因此 g1,g2,...gp1 取遍 1,2....p1 所有的数。

原根的个数比较多,且最小的原根一般比较小,直接枚举验证即可,枚举次数是常数级别。

对于 p 比较大时,φ(p)=p1,p2...pk,可以相同,对于一个数 g ,对于所有的....(待补)

高次剩余问题:

求解 xab(modp)

p 是质数时:

  1. b=0 ,有 x0(modp)

  2. 否则,求出原根 g ,则原方程变为 gaxgbmodp,用BSGS求出 b ,之后线性同余方程 axb(modp1),使用exgcd。

数论函数

积性函数: 设 f(x) 是一个数论函数,若对于任意互质的正整数对 a,b 均有 f(ab)=f(a)f(b)f(x) 为积性函数。

完全积性函数: 不需要 a,b 互质的积性函数。

常用的积性函数:

  1. 常数函数 1(x)=1

  2. 元函数: ε(1)=1,ε(x)=0(x>1)

  3. 单位函数: id(x)=x

  4. 幂函数: idk(x)=xk

  5. 欧拉函数 φ(x) 为小于等于 x 且与 x 互质的数的正整数的个数。

  6. 莫比乌斯函数 μ(x)

  7. 除数函数: ϱk(x)=d|xdk

欧拉函数

欧拉函数是个积性函数。

欧拉函数取值。

对于质数 p ,有 φ(p)=p1,φ(pk1)=pkpk1=pk(11p)

由欧拉函数的积性,设 n=piki

φ(n)=φ(piki)=φ(piki)

质因数分解在 O(n) 的复杂度内求得一个数的欧拉函数。

欧拉函数可以由线性筛(欧拉筛法)预处理得到。

考虑线性筛的过程: 对于一个数 i ,从小到大枚举当前筛出的质数 pj 筛掉 ipj ,直到 pj|i 为止。

假设已经知道了 i 的欧拉函数值,如果 pj 不是 i 的因子,则由积性。
φ(ipj)=φ(i)(pj1)
否则 φ(ipj)=φ(i)pj

莫比乌斯函数:

x=1 时,μ(x)=1

x 的质因子分解中所有的质数次数是 1 ,则 μ(x)=(1)kk 是因子个数。

x 有平方数因数时为 0

线性筛莫比乌斯函数。

pj 不是 i 的质数,则 μ(ipj)=mu(i),否则, ipj 的质因数分解中 pj 的次数一定大于 1 ,则 μ(ipj)0

除数函数

可以用埃氏筛在 O(nloglognlogk) 的时间复杂度内求出,根据定义算即可。

数论函数的乘积和狄利克雷卷积

利用乘积和狄利克雷卷积来构造新的数论函数。

乘积: f(n)g(n)

狄利克雷卷积: (fg)(n)=d|nf(d)g(nd)

性质:

·两个积性函数的乘积和狄利克雷卷积仍是积性函数。

·两个完全积性函数的乘积和狄利克雷卷积仍然是完全积性函数。

·乘积和狄利克雷卷积满足交换律和结合律。

重要的卷积:

μ1=ε

φ1=id

莫比乌斯反演

欧拉函数另一种表达形式: φ(n)=i=1nε(gcd(i,n))

μ1=ε

φ(n)=i=1nε(gcd(i,n))=i=1nd|gcd(i,n)μ(d)

μid=φ

另一个推论:

μ1=ε,同时由定义可得 ε1=1

φ1=id->μid=φ

ε(待补)

莫比乌斯反演定理, f,g 是两个数论函数,则有

f1=g<->μg=f

对于所有的数论函数 f ,均有 fε=f,也就是说 varepsilon 是狄利克雷卷积的单位元。

因为 μ1=ε,所以 μ1 互为逆元。

莫比乌斯反演主要考察:

  1. 莫比乌斯反演的应用和卷积结论的转换

  2. 交换求和号

  3. 数论分块

  4. gcd和lcm的转化

Day6

多项式

多项式加减乘法

A(x)=i=0naixi,B(x)=i=0mbixi

A(x)+B(x)=i=0max{n,m}(ai+bi)xi

A(x)B(x)=i=0nj=0m(aibj)xi+j

=k=0n+mj=0n(aibkj)xk

多项式的除法:

可以证明一定存在唯一的多项式q(x),r(x) 满足:

A(x)=q(x)B(x)+r(x)

q(x) 称为 B(x)A(x) 的商式,r(x) 称为余式。记做 A(x)r(x) (modB(x))

特别的,若 r(x)=0 ,则称 B(x) 整除 A(x)

多项式的系数表示法: 将 n 次多项式 A(x) 的系数 a0,a1...an 看作 n+1 维向量 a

定理:

如果多项式 f(x),g(x) 的次数都不超过 n 。且对于它们 n+1 个不同的数 a1...an 有相同的值,即

f(ai)=g(ai)

f(x)=g(x)

n+1 个点就能确定一个 n 次多项式。

如果选取 n+1 个不同的数 x0,x+1,...,xn 对多项式进行求值得到 A(x0),A(x1),...A(xn) 那么就称 {xi,A(xi):0in.iZ} 为多项式 A(x) 的点值表示。通过系数表示求点值表示的过程叫做求值,通过点值表示求系数表示的过程叫做求值。

为什么要用点值表示?

A(x),B(x)x0,x1,...xn 取值分别为 c0,....cn,d0,...dn 那么 A(x)B(x) 取值为 c0d0,c1d1,...cndn

复数及其运算

虚数单位 : i=1

形如 a+bi(a,bR) 的数称为复数,a 称为实部,b 称为虚部,全体复数的集合--复数集用 C 表示。

z=a+bi,w=c+bi

则有 z±w=(a±c)+(b±d)i

zw=ac+adi+bci+bdi2=(acbd)+(ad+bc)i

z/w=a+bic+di=(a+bi)(cdi)(c+di)(cdi)=(ac+bd)+(bcad)ic2+d2

共轭复数: z¯=abi (虚数取反)

复数的集合意义:

复数对应平面直角坐标系上的点,横轴为实轴,纵轴为虚轴,a+bi 对应的点为 (a,b)

复数对应的点到原点的距离称为复数的模长,即为 r=|z|,由勾股定理,|z|=a2+b2=zz¯

复数也可以用模长和幅角来表示。

复数与正半轴的角称为复数的幅角记为 φ=argz

所以 z=r(cosφ+isinφ)

复数的几何意义,设 OA,OB 分别为两个复数对应的向量,OX 为运算结果对应的向量,复数的加减法遵循平行四边形定则,复数的乘法按照模长相乘,幅角相加的运算规则,除法为乘法的逆运算,共轭为对实轴的轴对称结果。

欧拉公式:

对于任意实数 x ,都存在

eix=cosx+isinx

单位根

定义方程 zn=1 的所有复数根称为 n 次单位根,这样的单位根共有 n 个,分别为:

e2πkin(k=0,1,2,...n1)

这些单位根都分布在复平面的单位圆上,并构成一个正 n 边形,它们把单位圆分成 n 个部分。

本原单位根

快速傅里叶变换

传统的多项式乘法是 O(n2) 的,而且很难有优化空间,而多项式的点值表示法可以在 O(n) 的时间内完成乘法,因此,如果能找到一种有效的方法在点值表示法和系数表示之间转化,就能高效计算。

快速傅里叶变换可以认为有两部分,DFT和IDFT。

FFT最常见的算法是 Cooley-Tukey 算法。

假设现在有一个 n1 次多项式 A(x)=i=0n1aixi,为了方便设 n=2m,不足在高位补 0

nn 次单位根 ωn0...ωnn1 代入 A(x) 将其转换成点值表达 A(ωnk)(待补)

Day 7

平衡树

二叉搜索树

左儿子子树内所有点的键值都比该节点键值小,右儿子内所有点的键值都比该节点键值大。

Splay

节点存的信息:

  1. ch[0/1]: 左、右儿子

  2. fa: 父亲节点

  3. key: 键值

  4. cnt: 键值为 key 的数字个数

  5. siz: 子树及其大小

旋转: 把儿子节点旋转到父亲节点上。

伸展: 把一个节点伸展到根节点上。

Luogu3369【模板】普通平衡树

Luogu3871 [TJOI2010]中位数

记录当前序列的数的个数,查询中位数排名。

Luogu1110 [ZJOI2007]报表统计

维护两个平衡树,一个维护原序列,第三问为查询前驱后继,另一个维护差值,对应第二问。

Luogu1503 鬼子进村

记录一下删除过的点,平衡树维护删除的点的集合,每次查询前驱后继。

Luogu3391【模板】文艺平衡树

平衡树维护每个数的下标,每个子树代表一个 [l,r] 的区间,用懒标记标记当前区间是否需要反转。

如果没有 [l,r] 的子树,可以搞出这样一棵子树: 把 l1 旋转到根节点,r+1 到根节点的右儿子,可以发现根节点的右儿子的左儿子就是所需的区间。

在Splay上定位区间的一个常用方法,很多对区间询问和修改的操作可以这么实现。

Luogu5290[十二省联考2019] 春节十二响

特殊情况贪心的策略:将左右两条链的点,大的和大的合并,剩下的放在一个集合里面。

回到树上,把每个子树看成一条链,相当于对链进行合并。

Day8

(实际上是Day7)

第八天的在第七天的一块讲了。

字符串算法

Hash,KMP,字典树(挺简单就懒得记了233)

Luogu2463[SDOI2008]Sandy的卡片

先差分一下,求出每个从 S 开始的最长的公共子串,取最小值。

AC自动机

在Trie树进行KMP。

对于每个节点 u ,定义 fail[u]

fail[u] 指向Trie树上的一个点 v ,指向的节点的前缀和它后缀一样且长度最长的节点。

可以扩展 ch 的定义,在AC自动机上进行匹配时失配,不需要跳 fail ,直接跳 ch 即可。

求多个串在另一个串内出现的次数:

建出fail树,每个串的出现次数计数相当于从根节点到 x 节点都+1,可以看作给 x 节点+1,求子树 siz 即可。

Luogu2414[NOI2011]阿狸的打字机

Manacher

在S中相邻两个字符之间都插入一个'#'(没有出现过的特殊字符)

p[i] 为当前字符为对称轴时,能向左右延伸的最长长度。

假设已知 p[1..i1]p[i]

R 为当前向右延伸的最长长度。

posted @   do_while_true  阅读(62)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?

This blog has running: 1845 days 1 hours 34 minutes 14 seconds

点击右上角即可分享
微信分享提示