当前位置: 代码迷 >> 综合 >> NOIP 2020 赛前复习摘要
  详细解决方案

NOIP 2020 赛前复习摘要

热度:39   发布时间:2023-10-22 20:25:43.0

虽然多半都要退役滚粗,但是总还是要像以前一样写个摘要吧。

Part 1 退役滚粗豪华套餐

[完善自原博客:[CSP冲刺]代码常见错误总结 ]

  • O2 时写没有返回值的非 void 函数,直接 RE 暴毙。
  • 习惯了用 C++11 但 NOIP 不支持,直接 CE 暴毙。
  • long long ans=1;printf("%d",ans); 类型不一致在 Linux 环境下直接暴毙。(可以尝试使用输出优化解决这个问题)
  • 写带下划线开头的函数,如:__gcd(a,b),__builtin_popcount(x)
  • 10610^6106 个空的 set\map ,MLE/TLE
  • 以为某次计算不用取模结果直接溢出暴毙。
  • 忽视了循环变量/函数传参变量/pair内部包含的两个变量等变量是否需要开 long long 的问题,结果开了个假 long long
  • 交题之前没有检查值域范围,RE/WA 。常见检查对象:需要开两倍大小的数组;与边数有关的数组(注意前向星要开两倍);tire树,线段树等空间复杂度为 O(nlog?n)O(n\log n)O(nlogn) 的数组;高维dp数组范围开反的情况;二分的最大值和最小值;INF 设定的大小是否合适;变量的可能的值是否都在预计范围内等等。
  • 读题不仔细,爆零两行泪。例如没有仔细阅读每个数据范围(包括部分分范围);阅读题面时为了节省时间跳过了一些自以为不重要的部分。
  • freopen 时文件名应该直接复制,不要觉得文件名简单就不复制不要在文件名之间留任何空格,考试最后 5 分钟统一反复检查 freopen 的情况,记住要随时点保存
  • 动态规划/递推时访问 -1 下标元素——这个看人品,有时候不会WA,有时候可以逃过一劫。因此我们在做一些递推和动态规划的时候一定要非常注意边界的问题。
  • 常见不加会在评测机环境下 CE 的头文件:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstring>
  • 常见C++关键字:
hash,time,next,x0,y0,x1,y1,...
  • 数数题用错模数,直接爆零退役。要对 998244853998244853998244853 这样的模数保持警惕。
  • 多测题目样例全是 T=1T=1T=1 的时候没有将几个样例随机组合再测一遍,全 WA 暴毙。
  • 多测清空直接清空整个数组,再类似限制 ∑n\sum nn 的题目中 TLE 暴毙。
  • 必杀技:文件没有保存在指定的位置。(相信大家都知道具体的例子是什么…)

Part 2 一些容易忘记的 tip

  • 扩栈/开 O2 使用命令 -O2 -Wl,--stack=2000000000
  • 重载运算符:
bool operator <(const state &b)const{
    //STL习惯用<符号return step>b.step;
}
  • STL:
    经典运用例题:NOIP2018 赛道修建
  • 空间计算:
    空间的计算:
    • 估算程序已用内存:
      char/bool 1byte,int 4byte,long long/double 8byte,long double 16byte
      1 MB=1024 KB=1024×1024 byte
      注意计算时要保留一定的栈空间内存。
    • 查看程序已用内存:
      其实很简单,把自己程序的 exe 放到 bin 目录下然后用 cmd 输入 size.exe 你的程序名.exe 倒数第二个数就是你用了多少 byte 的内存。
  • 快速乘:
LL mul(LL x,LL y,LL MOD){
    LL res=(x*y-(LL)((double)x*y/MOD+0.1)*MOD)%MOD;if(res<0)res+=MOD;return res;
}

Part 3 模板专区

其实…我觉得 NOIP 真用不到什么模板吧…

exgcd

LL exgcd(LL a,LL b,LL &x,LL &y){
    if(!b){
    x=1,y=0;return a;}LL G,x0,y0;G=exgcd(b,a%b,x0,y0);x=y0,y=x0-(a/b)*y0;return G;
}

最短路

Dij

void Dij(){
    mem(dis,0x3f);Q.push(Pr(0,s));dis[s]=0;while(!Q.empty()){
    int x=Q.top().Y,tmp=-Q.top().X;Q.pop();if(tmp!=dis[x])continue;for(int i=head[x];i;i=e[i].nxt){
    int v=e[i].to,wi=e[i].w;if(dis[v]>dis[x]+wi){
    dis[v]=dis[x]+wi;Q.push(Pr(-dis[v],v));}}}
}

Floyd-bitset

for(register int i=1;i<=n;i++)//相当于之前的k,要放在外面for(register int j=1;j<=n;j++)if(d[j][i])d[j]|=d[i];

tarjan

有向图-强连通分量

void tarjan(int x){
    dfn[x]=low[x]=++ct,stk[++tp]=x;for(int i=G.head[x];i!=-1;i=G.e[i].nxt){
    int v=G.e[i].to;if(!dfn[v]){
    tarjan(v);low[x]=min(low[x],low[v]);}else if(!bel[v])low[x]=min(low[x],dfn[v]);}if(dfn[x]==low[x]){
    Bcnt++;int p;do{
    p=stk[tp],bel[p]=Bcnt,tp--;}while(p!=x);}
}

无向图-点双连通分量

void tarjan(int x){
    dfn[x]=low[x]=++ct;for(int i=0;i<G[x].size();i++){
    int v=G[x][i];if(!dfn[v]){
    tarjan(v);low[x]=min(low[x],low[v]);if(dfn[x]<=low[v]){
    Bcnt++;do{
    dcc[Bcnt].push_back(stk[tp]);}while(stk[tp--]!=v);dcc[Bcnt].push_back(x);}}else low[x]=min(low[x],dfn[v]);}
}

无向图-边双连通分量

void tarjan(int x,int fa)
{
    low[x]=dfn[x]=++cT;stk[++top]=x;for(int i=pre[x];i!=-1;i=a[i].nxt){
    int xnt=a[i].to;if(xnt==fa)continue;if(!dfn[xnt]){
    tarjan(xnt,x);low[x]=min(low[x],low[xnt]);}else low[x]=min(low[x],dfn[xnt]);//****}if(low[x]==dfn[x]){
    int y;while(1){
    y=stk[top--];bel[y]=x;if(y==x)break;val[x]+=val[y];siz[x]++;}}
}

线性基

struct Base{
    LL b[51];void Insert(LL x){
    for(int i=50;i>=0;i--)if((x>>i)&1){
    if(!b[i]){
    b[i]=x;break;}x^=b[i];}}LL Query(){
    LL ans=0;for(int i=50;i>=0;i--)if(!((ans>>i)&1))ans^=b[i];return ans;}
}B;

KMP

void get_fail(){
    for(int i=2,j=0;i<=m;i++){
    while(j&&t[i]!=t[j+1])j=fail[j];fail[i]=(t[i]==t[j+1])?++j:0;}
}int main(){
    scanf("%s%s",s+1,t+1);n=strlen(s+1),m=strlen(t+1);get_fail();for(int i=1,j=0;i<=n;i++){
    while(j&&s[i]!=t[j+1])j=fail[j];j=(s[i]==t[j+1])?++j:0;if(j==m)printf("%d\n",i-m+1);}for(int i=1;i<=m;i++)printf("%d ",fail[i]);
}

Part 4 杂

  • 关于这次考试:这次考试考好了,对我来说还是比较重要;考差了,这场考试就和我没有任何关系了:)其实前面的那么多次考试已经证明了我在 OI 方面并没有什么突出的表现,按自己正常的水平来看,本来就是该退役的,如果没有退役,还会对我的文化课造成很大的影响呢…?
  • 没有什么好想的,在考试的时候还真不要设定什么具体分数之类的目标;按照前几次模拟赛的经验,其实其他人的水平,这场考试能考多少分多数时候我都是估测的比较准确的。但是,这不意味着我们可以随便放弃一道自己看上去非常难的题目。根据前几次模拟赛的经验,当我相信自己能够做出来这道题目的时候,我几乎都成功了;一旦我开始有了怀疑,要做出来就非常困难。
  • 关于低级错误:我已经尽力将可能的错误都罗列在 Part 1 了,如果还是犯了,那就认命吧…

最后,无论成功还是失败:
NOIP 2020 RP++
虽然总会遇到不可抗因素,但是我们总有理由相信奇迹的存在。


END

退役快乐!