一些NOIP的要点汇总

1.dilworth定理:在一个序列中,最长下降子序列的个数(下降子序列的最小划分)就等于其最长不下降子序列的长度。

2.floor(),ceil(),round()三个函数的返回值都是一个浮点数,floor()是把浮点数向下取整,ceil()是把浮点数向上取整,round()是把浮点数四舍五入;

3.#define cin std::ios::sync_with_stdio(false); cin

   #define cout std::ios::sync_with_stdio(false); cout

   不可以与scanf()连用;

4.当进行减法取模时,应该先加上模数p再取模p来控制答案的范围在正整数范围内;

5.传递闭包:给定若干个元素和若干对二元关系,且关系具有传递性,那么可以使用Floyd来解决;

6.DP中,阶段要放在最外层循环;

7.对于一个有向图(存在负权边),求最短路时,可以用拓扑序的框架处理整个图,然后在不包含负权边的强连通分量里跑Dijkstra;

8.对于有向图的最小环问题,可以枚举起点k,用dijkstra来跑最短路。k第一次被取出时,令dis[k]=99999999;如果k第二次被取出时,dis[k]就是经过k的最小环长度;

9.设f[n]是斐波那契数列的第n项,那么gcd(f[n],f[m])=f[gcd(n,m)]; (证明的传送门在这里)

10.设f[n]是斐波那契数列的第n项,那么gcd(f[n],f[n+1])=1;(证明的传送门在这里)

11.将一个十进制的数转化为二进制:

inline void print(int x)
{
    stack<bool>st;
    while (x)st.push(x%2),x/=2;
    while (st.size())printf("%d",st.top()),st.pop();
    puts("");
}

12. 在一棵树中任选一个点u跑dfs找到最远的点p,然后再以p跑dfs找到最远的点q,那么dis[p][q]就是树的直径

13.在进行左移,右移运算时,被位移的数的类型要与答案类型一致。如:long long ans=(1<<n)就是不对的,而long long ans=(1LL<<n)是对的。

14.康托展开:一个全排列到一个自然数的双射X = A[0] * (n-1)! + A[1] * (n-2)! + … + A[n-1] * 0!A[i] 指的是位于位置i后面的数小于A[i]值的个数。这个算出来的数康拖展开值,是在所有排列次序 - 1的值,因此X+1即为在全排列中的次序。

15.在网络流中建双向边时,一定要把正向边和反向边建在一起。否则在i(边的序号)^1时会死的很惨;

16.在线段树pushdown时,一定要用k点的lazy值更新k*2和k*2+1的sum值,并把lazy直接传下去;在修改操作结束时更新sum,lazy;注意:lazy表示的是对下一个点的影响,它并不影响这一个点;

17.不开long long 见祖宗;

18.二分时,不能把l赋初值为1,r=INT_MAX;因为1+INT_MAX爆int啦!!!!!!!!!!!

19.dfs序的特点:在2*n个数中,闭区间l[u]到r[u]就是以x为根的字树的dfs序,因此可以通过dfs序把子树统计转化为序列上的区间统计;

20.若从s到t经过每条边各一次,则该路径是s到t的欧拉路;若从s到s经过每条边个一次,则该路径是欧拉回路;存在欧拉回路的图叫欧拉图

21.欧拉图的判定:图联通且所有点的度数是偶数;欧拉路存在的判定:图联通且恰好有两个点的度数是奇数,其余点都是偶数;

22.对于边权仅有0和正数差分约束系统,在跑最长路的时候可以用tarjan缩点;如果一个SCC中包含一条边权大于0的边,那么一定无解,否则可以正常tarjan缩点再跑拓扑序上的DP;

23.有向图的必经点和必经边:可以用NlogN的时间利用支配树求解,但若无环,就可以在原图和反图上跑两遍dp,求出S到x的路径数f[x]和x到T的路径数g[x];那么对于一个边(u,v),如果f[u]*g[v]=f[T],那么它就是桥。如果对于一个点u,f[u]*g[u]=f[T],那么它就是割点;

24.Konig定理:一张二分图,求出最小点集{S},使得图中任意一条边都至少有一个点属于S;这种问题称作最小点覆盖;而Konig指出:二分图的最小点覆盖所包含的点数等于二分图的最大匹配所包含的边数;

25.最小割等于最大流;最小割:将一些边删去后S和T不连通,且删去的边的容量之和最小;

26.在无向图中:桥一定是搜索树上的边,一个简单环上的边一定不是桥;

27.判断桥的方法:dfn[u]<dfn[v](需要考虑重边,所以记录的是父亲边);判断割点的方法:dfn[u]<=dfn[v](不需要考虑重边,所以不用记录);

28.点双连通图的判定:以下两个条件满足其一:1.图的顶点数不超过2;2.图的任意两点都同时包含在至少一个简单环中;

29.边双连通图的判定:任意一条边都包含在至少一个简单环中;

30.将一个图的所有桥删去后所得的若干连通块便是若干边双;

 ~不定期更新~

转载于:https://www.cnblogs.com/kamimxr/p/11526914.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值