NOIP常用技巧

本文总结了NOIP编程竞赛中的常见技巧,包括预处理log2值、强连通图特征、有桥图变为边双连通图的最少边数、字符串哈希判断循环节、异或性质、错排问题的递推公式、区间最大公约数性质、最大子段和的求解方法以及线性预处理、快速读入等算法和优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 因为cmath库中的log2函数效率不高,通常可以使用O(n)递推预处理出1-n这n种区间长度各自对应的k值(区间[x,y],k=log2(y-x+1)),具体的,设log[d]表示log2(d)向下取整,则有log[d]=log[d/2]+1
  2. 强连通图的特征即为任意一点i,都有i的入度和出度均不为0;DAG上通过加边使得该树变为强连通图的最少边数即为入度为0的点数in和出度为0的点数out的最大值;即为max(in,out);补充:通常应用为tarjan强连通缩点后的DAG
  3. 叶子节点数=1时,将一个有桥图通过加边变为边双连通图至少要添加的边数为0;否则为(叶子数+1)/2
  4. 利用字符串哈希判断循环节,len为整字串的长度n的约数
    当字符串为整循环节时 只需要判断l~r-len等于l+len~r
    当字符串需要补充字符成为周期时 只需要删除(r-l+1)%len的剩余字符,如上
    bool judge(int l,int r,int len)
    {
    	return h[r-len]-h[l-1]*power[r-l+1-len]==h[r]-h[l+len-1]*power[r-l+1-len];
    }
  5. 异或的技巧 

    自反性 A^B^B=A^0=A (异或同时满足交换律和结合律)

  6. 错排问题:要求将编号1~n的n个元素放回n个位置,元素i不能在i位置上的方案数;

     递推式为D(i)=(i-1)*[D(i-1)+D(i-2)]

    解释为:共有i个元素,当前放第x个元素不能放在x位置上,可分为两种情况:一种是x可选择i-1个位置其中一个与其互换位置,即被x占用的位置原先的数y在x的原位置,剩下i-2个元素错排方案为D[i-2]种,则方案为(i-1)*D[i-2];而另一种为x选择i-1个位置其中一个放置,被x占了的位置不占用x原来的位置,故会剩下i-1个元素,i-1个元素进行错排,方案为(i-1)*D[i-1]种,故上式成立。

    void D_init(int n)
    {
        d[1]=0;
        d[2]=1;
        for(int i=3;i<=n;i++)
            d[i]=(ll)((i-1)*(d[i-1]+d[i-2])%mod)%mod;
        return;
    }
  7. 区间最大公约数性质:gcd(a_{l},a_{l+1},a_{l+2},...,a_{r})=gcd(a_l,a_{l+1}-a_l,...a_r-a_{r-1}),因此查询区间的gcd即可有表达式:ans=(c_l,query(c_{l+1},c_r)),其中query(a,b)表示树状数组维护下的从
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值