信息部分总结及考试总结

//5.22

刚刚开始集训就是考试,非常让我难受,虽然惊喜的没有考到倒数几个,但还是平时那种辣鸡水平;满分

六百,就考了253,还有八分是骗的感觉贼凉;

考完才觉得之前学的东西弄得明白却都很难在考试是发挥出来,总是关键时刻掉链子,主要就是快速幂了,

这玩意就是容意错;

快速幂的二分思想比较神奇,主要就是以下;

int power(int a,int k,int mod){int s=1;while(k){if(k&1)s=s*a%mod;a=a*a%mod;k>>=1;}return s;}

神奇的写法教你做人。。。

//5.23

今天就是极度magical的日子;

数论的日子总是那么surprised;

扫描二维码关注公众号,回复: 1183314 查看本文章

今天主要教了三个定理:欧几里得定理、威尔逊定理、费马小定理;

威尔逊定理:若p为质数,则(p-1)!≡p-1(mod p).

费马小定理:若p为质数,则a^p≡a(mod p).

欧拉定理:若gcd(a,p)=1,则a^φ(p)≡1(mod p).

白天的课就这样结束啦;

晚上讲了KMP感觉还好;

KMPP:KMP这个和next很像,next函数计算复杂度是(m),开始以为是O(m^2),后来仔细想了想,cal__next里的while循环,以及外层for循环,利用均摊思想,其实是O(m),具体就看代码算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里糊涂,即使网上最简单的解释,依然看的稀里糊涂。

KMP:算法说明 一般匹配字符串时,我们从目标字符串str(假设长度为n)的第一个下标选取和ptr长度(长度为m)一样的子字符串进行比较,如果一样,就返回开始处的下标值,不一样,选取str下一个下标,同样选取长度为n的字符串进行比较,直到str的末尾(实际比较时,下标移动到n-m)。 

KMP主要代码:

int KMP(char *str, int slen, char *ptr, int plen) { int *next = new int[plen]; cal_next(ptr, next, plen);//计算next数组 int k = -1; for (int i = 0; i < slen; i++) { while (k >-1&& ptr[k + 1] != str[i])//ptr和str不匹配,且k>-1(表示ptr和str有部分匹配) k = next[k];//往前回溯 if (ptr[k + 1] == str[i]) k = k + 1; if (k == plen-1)//说明k移动到ptr的最末端 { //cout << "在位置" << i-plen+1<< endl; //k = -1;//重新初始化,寻找下一个 //i = i - plen + 1;//i定位到该位置,外层for循环i++可以继续找下一个(这里默认存在两个匹配字符串可以部分重叠),感谢评论中同学指出错误。 return i-plen+1;//返回相应的位置 } } return -1; }

//5.24

今天讲了manacher算法和trie树,发现难度蛮大的;

//5.25

特别的一天;学校安排去上海交大和纽约大学;

//5.26--28

这三天讲了好多东西

1.状压(话说我之前一直以为是壮鸭)讲解了超级多的例题呢!不过很难啊,并没有写多少例题;

状压:此dp可以理解为最暴力的dp,因为它需要遍历每个状态,所以将会出现2^n的情况数量,所以明显的标志就是数据不能太多(好像是<=16?),然后遍历所有状态的姿势就是用二进制来表示,01串,1表示使用,0表示未使用,就把所有的状态投射到很多二进制的数上(类似于hash?)然后对每个状态找上一"些"状态的方法如下代码,即状压dp的精髓!!!

一个神奇而又实用的方法,用处非常大;

例题好多的呢!做了好久。。。

2.位运算 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。

另外还有异或位运算 即参加预算单两个数据,按二进制进行“异或”预算。运算规则:0^0=0;0^1=1;1^0=1;1^1=0;即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

特殊作用:

(1)使特定位翻转找一个数,对应X要翻转的各位,该数的对应位为1,其余位为0,此数与X对应位异或即可。

(2)与0相异或,保留原值,X^00000000=10101110.

异或的几条性质:

(1)交换律

(2)结合律:(即(a^b)^c==a^(b^c))

(3)对于任何数x,都有:x^x=0,x^0=x

(4)自反性:a^b^b=a^0=a

3.树的dfs序:树的dfs序就是用来维护一系列树上的问题的,这类问题主要是解决一棵树上的所有后代结点信息的更改和祖先结点有关,主要先通过dfs来记录一个树的每一个顶点的出入时间戳,来控制它子树上的所有结点的状态的更新。用L[],R[]来记录这个祖先结点控制后代结点的区间。

dfs序的作用:

(1)相当于把树上的问题转化成了序列上的问题。(2)辅以各种数据结构(ST表、树状数组、线段树)进行运算。(3)子树求和->区间求和。

  1. 树的lca 即最近公共祖先

(1)tarjan“向上标记法”

dfs一条路搜到底时,搜到了起点,在回溯返回时每次将子节点通过并查集合并到父节点上,当搜到终点时,那么father[起点]就是起点和终点的转折点LCA。 (2)RMQ树上倍增法需要一个数组F[i][j],表示i节点之前第2^j号祖先。当然,F[i][0]即是i的父节点。 F[i][j]==F[F[i][j-1]][j-1]. 那么可以O(nlogn)预处理出数组F。

  1. 树上差分

树上差分的基本操作即找出被所有路径都覆盖的边在树中将所有路径起、始权值加1,起、始点的lca权值减2,从所有叶节点开始把权值往上累加。最终权值为路径数的点到其父亲的边为所求边。或 将每条路径(s,t)上的每个点权值增加1,求各点权值在树中将所有路径起、始权值加1,起、始点的lca权值减1,lca的父亲权值减1,从所有叶节点开始把权值往上累加。

  1. 线段树、树状数组

线段树适用于和区间统计有关的问题。比如某些数据可以按区间动态进行修改,以及需要按区间多次进行查询。

(1)线段树的平分构造,实际上是用了二分的方法。

(2)若根节点对应的区间是【a,b】,那么它的深度为log2(b-a+1)+1(向上取整)。

(3)叶子节点的数目和根节点表示区间的长度相同。

(4)线段树节点要么0度,要么2度,因此若叶子节点数目为N,呢线段树总结点数目为2N-1.

  1. 左偏树:左偏树是一种可并堆,也是一种优先队列容器。它除了支持查找最小值、删除最小值、插入值外,还支持优先队列不必需的合并(merge)操作。且左偏树的编程复杂度低,效率较高,适合竞赛中使用。

左偏树满足以下两条性质:

(1)堆性质:任意节点的优先度比其左右儿子高。

(2)左偏性质:任意节点(外界点除外)的左儿子一定不小于右儿子的距离:显然可以得到推论:左偏树中任意节点i的距离为其右儿子距离+1;

//5.29

这是最重要的,ACM欢乐赛(早就想槽了,欢乐在哪里)

一场让我心糟的比赛

两人或三人一组,总共一组两台电脑,只有一台能用来写代码;

我全程写方案,另一个人来写,结果我的每个方案他都不会用;

总共就写了三道题;

感觉现在凉凉的;

不过话说要是一场欢乐赛就有一顿开封菜我还是很乐意的;

(吃货属性爆发)!!!

所以以上就是八天以来的总结啦!

第一次写博客,估计很烂的!

                                                                  Yanghaoheng_2021   2018.5.30

猜你喜欢

转载自www.cnblogs.com/yyh13806864722/p/9113832.html