背景
弱省小白至强省名校集训,心得颇多
心得
学习划水一年,连模板都别不全的小白到某市某中学参加考前集训。
之前在自己的学校里都是各种考试韧性测试,各种考试爆零。一心只求正解,殊不知出题人心险恶。
而某校则不同。他们的题目大都一套一套做,并且考试时既有签到题,也有玄学题。上午考完试后,会发出天书题解,并会在讲题前留有时间自己分析。在讲题时,都是些OI大佬,每个人都会有一套自己的讲题方法。
废话不多说
在集训那些天,本人倒是补上了之前部分记不到的模板。在讲一道签到题求逆元时,详解了三种求逆元的方法:
?:费马小定理:
a
p
−
2
=
a
−
1
(
%
p
)
a^{p-2}=a^{-1} ~(\%p)~
ap−2=a−1 (%p)
?:线性求逆元:
i
n
v
i
=
(
p
−
p
/
i
)
∗
i
n
v
p
%
i
%
p
inv_i=(p-p/_i)*inv_{p\%i}\%p
invi=(p−p/i)∗invp%i%p
?:拓展欧几里得: 一大玄学算法,以类似与求模方程的解法求逆元…… 费马小定理适用于单个数求逆元,线性求逆元法适用于某区间内所有数的逆元,拓欧的话随缘强者专属
除此之外,就是区间类问题:
?:只维护不修改,O(1)算法ST最快
?:只求和且修改,树状数组常数优
?:既求最值由算和,用线段树最自由
此外,ST表用的时2进制思想,通过log2来划分区间;树状数组无法维护就最大值,借助计算机补码来缩小常数;线段树是骗分最常使用的数据结构。
?:矩阵优化:通过建立转移矩阵,利用快速幂算法,把线性做法的时间复杂度降到log级别
以上种种,很少出现在正解之中
这不是废话
这次外出考前集训,学习到的知识点其实很少某蒜客上都讲过。这次学到的大都是部分分的拿法以及考试的策略问题。
—————————暴力是正解之母,骗分是省一之师—————————
暴力的优化往往可以拿到很高的分数。在之前本人只想正解
以上算法常用于骗分:
1.去他的组合数计算,线性求阶乘后逆元乘法取模,把帕斯卡·卢卡斯完全抛之脑后。当然,本人记不到他们的代码
2.忘记繁琐的区间模拟 逆序对,树状数组代码短[与线段树相比],好理解[相比于ST表],充分调用了计算机底层运算,不要大常数,不要O(
n
2
n^2
n2),只要O(
n
l
o
g
n
nlogn
nlogn),你值得拥有。
3.朴素动态规划或暴力递归,复杂度我确不敢恭维。线性算法要超时?矩阵优化来帮你。集训前本人对矩阵不是一窍不通的。推出转移矩阵,写一个矩阵乘法函数本人不会写类,懒得重载运算符+快速幂,没有AC也有80.
4.内存超限惹不起,滚动数组造奇迹。在ST表或求大数斐波那契时,本地DEV不会报MLE,一提交就可能超限。化二位为一维,化一维为个体。
优化操作,滚动最秀;内存超限,降维千古
//斐波那契滚动
int a=1,b=1,c;
for(int i=3;i<=n;i++){
c=a+b;
b=c;
a=b;
}
cout<<c<<endl;
5.打表是一门技术,有时也需要靠运气。
注意事项
1.bug!!!如果你写完代码跑样例的时候摊上bug,那你多半gg了。写代码之前一定要看清题目,写的时候也要谨慎。重庆好啊,windows系统可以用devcpp调试。
2.十年竞赛一场空,没写long long见祖宗!不要让long long阻碍你的梦想,不要为RE让你止步不前。
3.AC还是GG,freopen很关键!在考试时应反复检查自己的文件读取,提交时不要在freopen前留下// [尤其时很多用惯了OJ评测的同学,需要尤为注意]
4.数组大小要合适。开小了,AC前加P;开大了,你只剩MLE。
人生没有最短路,你我就是连通图,今天你AC,弗骄,弗傲,明日…………