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、交换律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
讲了些树状数组,线段树和左偏树。
树状数组一看上去就是个很神奇的东西 ↓
树状数组跟线段树很像,能用树状数组解决的问题,基本上都能用线段树解决,而线段树能解决的问题树状数组不一定能解决,但树状数组的效率要高很多。
//返回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一样,这也是关于字符串的一种算法,主要处理的是回文串。
……………
大概,就这样草率地结束了吧……