Corner Cat 训练实录

这篇博客记录了Corner Cat在2019年的CCPC和ICPC编程竞赛中的表现,获得多个金银奖牌。博主分享了多项算法技巧,如枚举优化、二项式定理应用、莫队算法注意事项、斜率优化的细节等。还提醒在解决数学问题时要关注归纳法,以及在处理递推关系时考虑二进制特性。此外,博主还提到一些编程比赛的实战经验,如牛客暑期多校训练营的成绩和排名。
摘要由CSDN通过智能技术生成

现场赛记录:[名称:奖项/排名]

2019:

  • CCPC厦门:Gold/19
  • ICPC南京:Silver/32
  • ICPC南昌:Silver/38
  • CCPC Final:Silver/29

To do List:


总结:

  • 若一个式子长这样—— ∑ i ∑ j ( n i ) ( m j ) . . . \sum_{i} \sum_{j}\binom{n}{i}\binom{m}{j}... ij(in)(jm)...,可以考虑枚举一维然后利用二项式定理化简另外一维,降低了一层复杂度
  • 一些数学猜公式题可以考虑归纳
  • 莫队的时候尤其要注意排序不要写错,写错了会出现莫名的WA和RE,不明白为什么(雾
  • 写斜率优化的时候,要注意维护的凸包是叉积严格<0或者>0,=0的时候一定要删掉,容易出现问题
  • 要尤其注意sort时候<的重载,写的不好会TLE
  • 随机点算图形期望的时候要先真·随机产生点,再把不在范围内的点剔除
  • 实数二分保留答案的那一边不要有eps(比如:l=mid,r=mid-eps或者l=mid+eps,r=mid)
  • 写凸包的时候注意<=0和>=0不能写反
  • 一个字符串s的循环周期并不一定是最小循环周期的倍数,如aaabcdaaa,6,7,8,9都是其循环周期
  • 指数降幂公式: a x % p = a x % ϕ ( p ) + ϕ ( p ) % p ( x ⩾ ϕ ( p ) ) a^x \% p =a^{x \% \phi(p)+\phi(p) } \% p (x\geqslant \phi(p)) ax%p=ax%ϕ(p)+ϕ(p)%p(xϕ(p))
  • 看见 a ( n ) a(n) a(n) a ( n / 2 ) a(n/2) a(n/2)关系的递推式,要想到二进制
  • 形如 x 2 − d y 2 = 1 ( d 是 正 整 数 且 不 是 完 全 平 方 数 ) x^2-dy^2=1(d是正整数且不是完全平方数) x2dy2=1(d)的不定方程叫pell方程,设其有一组特殊最小正整数解 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)则有 x n + 1 = x 0 x n + d y 0 y n , y n + 1 = y 0 x n + x 0 y n x_{n+1}=x_0x_n+dy_0y_n,y_{n+1}=y_0x_n+x_0y_n xn+1=x0xn+dy0yn,yn+1=y0xn+x0yn 以及 x n + 2 = 2 x 0 x n + 1 − x n , y n + 2 = 2 x 0 y n + 1 − y n x_{n+2}=2x_0x_{n+1}-x_n,y_{n+2}=2x_0y_{n+1}-y_n xn+2=2x0xn+1xn,yn+2=2x0yn+1yn
  • 对于 x 2 − d y 2 = − 1 ( d 是 正 整 数 且 不 是 完 全 平 方 数 ) x^2-dy^2=-1(d是正整数且不是完全平方数) x2dy2=1(d),可能有解可能有无数解,解为 x n + 1 = ( x 0 2 + d y 0 2 ) x n + 2 d x 0 y 0 y n , y n + 1 = 2 x 0 y 0 x n + ( x 0 2 + d y 0 2 ) y n x_{n+1}=(x_0^2+dy_0^2)x_n+2dx_0y_0y_n,y_{n+1}=2x_0y_0x_n+(x_0^2+dy_0^2)y_n xn+1=(x02+dy02)xn+2dx0y0yn,yn+1=2x0y0xn+(x02+dy02)yn。若d为素数且d=4k+1,则必定有解
  • 对于 x 2 − d y 2 = k 2 x^2-dy^2=k^2 x2dy2=k2,等价于 ( x k ) 2 − d ( y k ) 2 = 1 (\frac{x}{k}) ^ 2 - d (\frac{y}{k}) ^2 = 1 (kx)2d(ky)2=1
  • 若b能整除a,则 a b % m o d = a % ( b × m o d ) b \frac{a}{b} \% mod = \frac{a \% (b \times mod)}{b} ba%mod=ba%(b×mod)
  • 当用cdq分治+FFT处理递推卷积的时候,若形式是 f ( n ) = ∑ f ( i ) × f ( n − i ) f(n)=\sum f(i) \times f(n-i) f(n)=f(i)×f(ni),那么在处理 c d q ( l , r ) cdq(l,r) cdq(l,r)的时候,将 A = ( f l , f l + 1 , . . . , f m i d ) 与 B = ( f 1 , f 2 , . . . , f r − l ) A=(f_l,f_{l+1},...,f_{mid})与B=(f_1,f_2,...,f_{r-l}) A=(fl,fl+1,...,fmid)B=(f1,f2,...,frl)卷积的时候,要注意对于B中的 f i f_i fi,若 i < l   o r   i > m i d i<l \ or \ i>mid i<l or i>mid,系数要乘2。
  • 要求字典序最小的问题一般都能贪心逐位确定。
  • ( x + 1 ) k ↓ = x k ↓ + k x ( k − 1 ) ↓ (x+1)^{k\downarrow}=x^{k\downarrow}+kx^{(k-1)\downarrow} (x+1)k=xk+kx(k1), x k = ∑ i = 0 k x i ↓ S ( k , i ) x^k=\sum_{i=0}^k x^{i\downarrow}S(k,i) xk=i=0kxiS(k,i)
  • 对于任何数x, x 0 ↓ = 1 x^{0 \downarrow}=1 x0=1
  • 无向图Matrix-Tree定理:求无向图G的生成树个数。设 D D D是图G的度数矩阵( D ( i , i ) D(i,i) D(i,i)表示第i个点的度数,其它位置是0),设 A A A是图G的邻接矩阵( A ( i , i ) = 0 A(i,i)=0 A(i,i)=0 A ( i , j ) A(i,j) A(i,j)表示i和j之间的边数),基尔霍夫矩阵 Q = D − A Q=D-A Q=DA,则对于 Q Q Q的任意一个代数余子式 Q ′ Q' Q d e t ( Q ′ ) det(Q') det(Q)的值就是图G的生成树个数。
  • 有向图Matrix-Tree定理:求以某个点为根的树形图个数。 D 、 A 、 Q D、A、Q DAQ的定义同无向图的,对于点 w w w,设 t w ( G ) t_w(G) tw(G)表示以w为根的树形图的个数, Q w Q_w Qw表示矩阵Q第w行对应的代数余子式,那么 t w ( G ) = d e t ( Q w ) t_w(G)=det(Q_w) tw(G)=det(Qw)
  • BEST theorem:求欧拉图中欧拉回路的个数。 e c ( G ) = t w ( G ) × ∏ v ∈ V ( d e g ( v ) − 1 ) ! ec(G)=t_w(G) \times \prod_{v\in V} (deg(v)-1)! ec(G)=tw(G)×vV(deg(v)1)!,其中 d e g ( v ) deg(v) deg(v)表示点v的入度, w w w的选取是任意的,因为容易发现对于欧拉图,所有点的 t i ( G ) t_i(G) ti(G)的值都相同。
  • ( n a ) × ( a x ) \binom{n}{a} \times \binom{a}{x} (an)×(xa) 不等于 ( n x ) \binom{n}{x} (xn)
  • 模2意义下的多项式降幂: f ( x ) 2 = f ( x 2 )   ( m o d   2 ) f(x)^2=f(x^2) \ (mod \ 2) f(x)2=f(x2) (mod 2)
  • μ ( n ) 2 = ∑ d 2 ∣ n μ ( d ) \mu(n)^2=\sum_{d^2|n} \mu(d) μ(n)2=d2nμ(d)
  • ϕ n ( x ) \phi _n(x) ϕn(x)表示n次单位根下的分圆多项式,那么有 x n − 1 = ∏ d ∣ n ϕ d ( x ) x^n-1=\prod_{d|n} \phi _d(x) xn1=dnϕd(x),可以用来对于 x n − 1 x^n-1 xn1的因式分解。分圆多项式可以通过莫比乌斯反演求得,即 ϕ n ( x ) = ∏ d ∣ n ( x d − 1 ) μ ( n d ) \phi _n(x)=\prod_{d|n}(x^d-1)^{\mu(\frac{n}{d})} ϕn(x)=dn(xd1)μ(dn)。其中 ϕ n ( x ) \phi _n(x) ϕn(x)的最高次数正好是 ϕ ( n ) \phi(n) ϕ(n),也就是说具体的求的时候可以将其对 x ϕ ( n ) + 1 x^{\phi(n)+1} xϕ(n)+1取模,类似背包那种的dp。
  • 开根下取整可以用牛顿迭代的整除形式做,最终 k k k n k \frac{n}{k} kn会收敛到相差<=1的数字。
  • 对偶规则:
  • 互补松弛性:在线性规划问题的最优解中,如果对应某一约束条件的对偶变量值为非零,则该约束条件取严格等式;反之,如果约束条件取严格不等式,则其对应的对偶变量也一定为零。
  • [ i m o d    2 = 0 ] [i \mod 2 = 0 ] [imod2=0]等价于 ( − 1 ) i + 1 i 2 \frac{(-1)^i+1^i}{2} 2(1)i+1i,可以用来式子化简
  • 若需要求期望,并且不是在取模意义下,有时候需要dp求方案数和总权值和,但这个可能会很大,可以用long double来保存
  • 建好一个kdtree之后,若要在上面寻找一个已有点,注意一定要以矩形的形式查找,两边都要递归下去
  • 对于01图的最短路,可以采用双端队列,即如果当前扩展的边是0,就放队列开头,如果当前扩展的边是1,就放队列结尾,这样的话复杂度是线性的
  • 容斥原理也可以通过递推来理解,设 F ( P ) F(P) F(P)表示至少有P个位置不合法的方案数, G ( P ) G(P) G(P)表示恰好有P个位置不合法的方案数,那么 G ( P ) = F ( P ) − G ( P + 1 ) G(P)=F(P)-G(P+1) G(P)=F(P)G(P+1),倒推一下, G ( 0 ) G(0) G(0)就是答案
  • 若一个最优化安排问题有明显的时间段,有t时刻的储存到t+1时刻之类的限制,往往都可以建成网络流模型;若网络流时间复杂度过不去,可以考虑能否贪心,贪心的一种思路就是从前往后我尽可能地买,在后面决定这些卖不卖,留到最后还没卖出的就可以视作当时没有制造出来
  • 在考虑树上路径最优化问题的时候,可以考虑线头DP,在做线头DP的时候,先不考虑根节点k本身,先把它孩子子树合上来,然后再考虑从k点加线头进行转移,然后再考虑从k点封线头进行转移(可能会形成孤立点),然后给那些经过k点的方案加上k点的权值,有时候你还需要多开一个维度的状态表示是否经过了k点
  • 在做queue或者priority_queue的时候,若从中间return了,那么下次再执行算法的时候一定要清空队列!
  • 回滚莫队可以将一般莫队的删除操作变成撤销操作。按左端点所在块编号为第一关键字,右端点为第二关键字排序。对于左端点在同一个块里的询问我们统一处理:对于那些右端点也在块内的,我们直接暴力;对于那些右端点在块外的,一定是单增的,我们假设当前块的最右边是right,那么我们首先把右端点从上次的位置移到这次的位置(加入操作),然后把左端点从right移到当前询问的左端点,得到答案后,再把左端点移回right。(这是撤销操作,不是删除操作)
  • 遇到 ( − 1 ) ∣ i & x ∣ (-1)^{|i\&x|} (1)i&x的时候,要想到构造 F W T FWT FWT
  • 求二分图最大匹配的最小字典序解:从n->1依次去找增广路,找增广路的时候优先去标号小的点。这样做的话,可以保证标号小的点一定可以找到一个最小的匹配点使得其满足最大匹配。
  • 对于树上倍增和树链剖分的总结:
构建修改询问
树上倍增 O ( n l o g n ) O(nlogn) O(nlogn)x O ( l o g n ) O(logn) O(logn)
树链剖分 O ( n ) O(n) O(n) O ( l o g n ) O(logn) O(logn) O ( l o g 2 n ) / O ( l o g n ) O(log^2n)/O(logn) O(log2n)/O(logn)
说明:
当有修改的时候肯定无脑选择树上倍增。
当没修改的时候,优先选择代码复杂度低的树上倍增,但如果题目对构建的时间复杂度/空间复杂度有要求,那么只能树链剖分。
另外没有修改的的树链剖分的询问是可以做到logn的,可以对于每个点,提前维护它到top的信息,需要额外的时间和空间都是线性的。
  • 当计算dp的时候,比如 d p [ i ] [ j ] + = d p [ i − 1 ] [ k ] ∗ c [ j ] [ k ] % m o d ∗ b [ j ] % m o d dp[i][j]+=dp[i-1][k]*c[j][k] \% mod*b[j] \%mod dp[i][j]+=dp[i1][k]c[j][k]%modb[j]%mod,可以先判断 d p [ i − 1 ] [ k ] dp[i-1][k] dp[i1][k]是不是0,如果是0就continue,会大大加快速度!

  • 数论题遇见固定模数,首先考虑能不能本地打表。

  • FFT的时候,要注意精度问题,要考虑是否需要开long double

  • 指数型生成函数

  • FWT:

    orandxor
    F W T ( A ) = [ F W T ( A 0 ) , F W T ( A 0 ) + F W T ( A 1 ) ] FWT(A)=[FWT(A_0),FWT(A_0)+FWT(A_1)] FWT(A)=[FWT(A0),FWT(A0)+FWT(A1)] F W T ( A ) = [ F W T ( A 0 ) + F W T ( A 1 ) , F W T ( A 1 ) ] FWT(A)=[FWT(A_0)+FWT(A_1),FWT(A_1)] FWT(A)=[FWT(A0)+FWT(A1),FWT(A1)] F W T ( A ) = [ F W T ( A 0 ) + F W T ( A 1 ) , F W T ( A 0 ) − F W T ( A 1 ) ] FWT(A)=[FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1)] FWT(A)=[FWT(A0)+FWT(A1),FWT(A0)FWT(A1)]
    F W T ( A ) [ i ] = ∑ j   o r   i = i A [ j ] FWT(A)[i]=\sum_{j \ or \ i=i}A[j] FWT(A)[i]=j or i=iA[j] F W T ( A ) [ i ] = ∑ j   a n d   i = i A [ j ] FWT(A)[i]=\sum_{j \ and \ i=i}A[j] FWT(A)[i]=j and i=iA[j] F W T ( A ) [ i ] = ∑ j = 0 n − 1 ( − 1 ) ∥ j ∩ i ∥ A [ j ] FWT(A)[i]=\sum_{j=0}^{n-1}(-1)^{\| j \cap i\|}A[j] FWT(A)[i]=j=0n1(1)jiA[j]
  • 卡常注意事项:

    1. long long类型和int类型的运算很关键,尽可能使用int类型
    2. 递归改非递归没啥作用
  • 当需要从树上一个点暴力向上跳的时候,不妨考虑能否通过树链剖分进行优化

  • 在整数域上做二分/三分的时候,check函数尽可能不要使用实数

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 内存回收的时候不要回收根节点/0节点/空节点

找规律题总结:

  • OEIS、BM、插值
  • 不少找规律的问题是前面几项或十几项没规律,从中间开始有规律
  • 对一个数列找规律的时候,可能可以将其拆分成两个序列的并,分别可以OEIS/BM

训练实录:[时间 名称:通过题数/总题数,Rank:排名]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值