15天学习总结(上)

2018.5.22

第一天就考试,整个人被虐得不要不要的,第一次被数组范围坑得这么惨,爆掉了一半的分数。

以后再也不看见个单词就直接打上去了,Impossible打成impossible这种事情太坑爹了,而且居然有好几组的数据处来的答案是impossible,被这两个小得不能再小的错误坑了好几十分,rating又降了(有点好奇调到0会怎样)。

这导致我拿了张餐巾纸(草率得我自己也看不下去了)在上面写上这两个错误来提醒自己。

还要记得每次考试开始时提醒自己,第1题真的没有那么难,不用想得那么复杂(被数学题坑习惯了,总感觉题目里有坑等着你去跳)。


2018.5.23

学了点初等数论,这东西学数学时有学过一点,不过还是搞不怎么懂,还有一大堆定理。

威尔逊定理:当且仅当p为素数时,(p-1)!恒等于-1(mod p) (后面还看到一句其结论对于实际操作完全没有益处(¬_¬))

费马小定律:由一堆剩余系定理和同余定理证出来的   若p为质数,a^(p-1)≡1(modp)

欧拉定理:在数论中也被叫做费马—欧拉定理,这是一个关于同余的性质(这完全就是用来凑字数的 ̄▽ ̄)

若n,a为正整数,且n,a互质,则: 

证明什么的就不写了,太麻烦了。

还有埃式筛法和欧拉筛法(线性筛法),最大公约数和最小公倍数,素数判定,素数和合数……这些我觉得按我的能力没法好好写出来的东西,所以这里提一下就好了。


2018.5.24

早上把昨天讲的三个定理重新证明了一下,然后好像就没讲什么了。


2018.5.25

在上海浪得站着都快睡着了。


2018.5.26(请假中)


2018.5.27

昨天应该讲了一些有关位运算的什么实用技巧,课件简单地介绍了下什么是位运算。

程序中的所有数在计算机内存中都是以二进制的形式储存的。说穿了,就是直接对整数在内存中的二进制位进行操作。

还有 ↓

xor运算的性质

1、交换律
2、结合律(即(a^b)^c == a^(b^c))
3、对于任何数x,都有x^x=0,x^0=x

4、自反性 A XOR B XOR B = A xor  0 = A

又稍微讲了些树的dfs,lca,rmq等。

树的dfs ↓

intpos;//记录重心的编号

void dfs(intx,int father)

{

    v[x]=1; size[x]=1;

    intMaxp=0;//邻接表枚举i的每个相邻节点

    for(inti=Link[x];i;i=e[i].next)

    {

        int y=e[i].y;

        if (y!=father)

        {

            dfs(y,x); 

            size[x]+=size[y];

            Maxp=max(Maxp,size[y]);

        }

   }//forend

   Maxp=max(Maxp,n-size[x]);

   if(Maxp

2018.5.28

讲了些树状数组,线段树和左偏树。

树状数组一看上去就是个很神奇的东西 ↓

15天学习总结(上)_第1张图片

树状数组跟线段树很像,能用树状数组解决的问题,基本上都能用线段树解决,而线段树能解决的问题树状数组不一定能解决,但树状数组的效率要高很多。

//返回i的二进制最右边1的值  
int lowbit(int i)  
{  
    return i&(-i);  
}
//返回A[1]+...A[i]的和  
int sum(int i)  
{  
   int res=0;  
   while(i>0)  
   {  
      res += c[i];  
      i -= lowbit(i);  
   }  
   return res;  
}  
//令A[i] += val  
void add(int i,int val)  
{  
    while(i<=n)  
    {  
        c[i] += val;  
        i += lowbit(i);  
    }  
}  


2018.5.29

ACM欢乐赛,这是个看队友的比赛,它让我欢乐得悲伤不已。队友一直在水也就算了,居然还想把粉红色的气球留给我(粉红色!!!(ꏿ᷄౪ ꏿ᷄ ̨ )͞ 当时我就惊呆了),

这场比赛,我又犯了刚开始提到的错误,一直和第一题死坑,明明排序好就可以直接输出了,我居然脑子犯抽一定要按题目来你去一个我去一个,好好的一个几行就可以解决的问题弄出个几十行来,感觉自己棒棒哒(才怪呢!!!壁|( ̄Д  ̄)ノ)

复制粘贴这是一个灰常灰常神奇的东西,因为它,我花了半个多小时去找一个压根就不存在的错误(不行这太悲伤了让我去缓缓(〒︿〒))。

细节决定成败,自从学信息后,我第一次发现,原来错误(犯蠢)这东西可以无处不在。


补充:

还有些不知道是什么时候学的了,就一起放在最后。

1.KMP(由D.E.Knuth,J.H.Morris和V.R.Pratt三位大神同时发现)

简单说就是通过将模式串移动,利用匹配失败后的信息,减少匹配次数,来达到快速匹配的目的

int KmpSearch(char* s, char* p)  
{  
    int i = 0;  
    int j = 0;  
    int sLen = strlen(s);  
    int pLen = strlen(p);  
    while (i < sLen && j < pLen)  
    {  
        //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++      
        if (j == -1 || s[i] == p[j])  
        {  
            i++;  
            j++;  
        }  
        else  
        {  
            //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]      
            //next[j]即为j所对应的next值        
            j = next[j];  
        }  
    }  
    if (j == pLen)  
        return i - j;  
    else  
        return -1;  
}  


void GetNextval(char* p, int next[])  
{  
    int pLen = strlen(p);  
    next[0] = -1;  
    int k = -1;  
    int j = 0;  
    while (j < pLen - 1)  
    {  
        //p[k]表示前缀,p[j]表示后缀    
        if (k == -1 || p[j] == p[k])  
        {  
            ++j;  
            ++k;  
            //较之前next数组求法,改动在下面4行  
            if (p[j] != p[k])  
                next[j] = k;   //之前只有这一行  
            else  
                //因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]  
                next[j] = next[k];  
        }  
        else  
        {  
            k = next[k];  
        }  
    }  
}  

说实在的,上面那是什么东西,我不知道。

2.manacher

和KMP一样,这也是关于字符串的一种算法,主要处理的是回文串。

……………

大概,就这样草率地结束了吧……

你可能感兴趣的:(15天学习总结(上))