算法备忘录

信息界的许多神犇喜欢写博客。而他们的博客里面有很多对初学者或者老年竞赛者“不那么友好”的词汇和概念——至少一下子是看不懂的。这里还是总结一下那些听起来有点玄乎的概念,也算是稍微给自己做个提醒。

维护

维护说白了就是“保存信息”,是一种比较高端的说法。
信息问题一般都会用“询问-回答”的方式来出题。这类问题还可以细分为静态问题和动态问题,算法还有离线算法和在线算法之分。
对于每个询问,我们都会尝试去计算答案。有时候某些数值我们想直接调用,而不是重复计算。因此,我们会说去“维护”某个值,目的是快速得到答案。
举个例子,CQOI2018的交错序列。题目中对于一个\(\mathcal{1}\)字符不相邻的\(\mathcal{01}\)序列\(\lambda\),如果有\(x\)\(\mathcal{0}\)\(y\)\(\mathcal{1}\),求:
\[ \sum\limits_{|\lambda|=n}x^ay^b \pmod{m} \tag{1-1} \]
题目不再赘述。我们要求的答案可以表示成:
\[ \sum\limits_{k=0}^a(\dbinom{a}{k}n^a(-1)^{a-k}\sum\limits_{|\lambda|=n}y_{\lambda}^{a+b-k}) \tag{1-2} \]
由于\(\sum\limits_{|\lambda|=n}y_{\lambda}^{a+b-k}\)很不好计算,我们事先计算,对于不同的\(k\)把对应的值保存起来。

维护的方法有很多。一般主流的方法是使用数据结构。上面这道题使用的是动态规划。当然,这里到底能不能用“维护”一词还有待考证。

贡献

虽然信息学的数学计算基本都是和整数打交道,但整数还是有一定分类的。贡献一词一般是针对数值而言的。
a[i]=val;
来看这个最简单的代码块。这里的\(i\)是数组的下标,而\(val\)是数组元素对应的值。
有句俗话说得好,“不开\(\mathtt{long\ long}\)见祖宗”。为了防止整数“存不下”,我们会将大部分int变量换成long long
但是,代码中的i是数组下标,不能用long long代替。这样的整数可以叫做“标号”,反之叫做“数值”。
一般的,对于两个变量\(a_1,a_2\)来说,由其中一个变量值推导出另外一个变量值,然后把这个值填进去,有点类似于“数值转移”。这种数值转移的多少我们就叫做这个变量的“贡献”。
比如说,\(\mathcal{01}\)序列\(\lambda\),要求计算其中\(\mathcal{0}\) 的个数。我们说\(\mathcal{1}\)的贡献是0,因为它的存在不会使答案增加;而\(\mathcal{0}\)的贡献是1,因为多一个0,答案就增加1。

猜你喜欢

转载自www.cnblogs.com/LinearODE/p/10680665.html