初征——NOIP2018游记

时间:2022-04-19 03:37:19

前言

从最初接触oi到今年noip到来,也已经将近有一年了。从对于程序一窍不懂到现在开始学习算法,只是短短的不到一年的时间罢了。这次noip,不仅仅是我oi生涯的第一次noip,更是相当于是对我这一年的努力的一个检验。希望这次能取得一个好的成绩吧。

背景

初一时参加了南海区区赛,结果发挥失常,只有三等奖,痛心疾首,遂定下noip2018一等奖的目标。

初赛

不知道为什么前一天晚上睡眠质量极其差,基本上每个小时我是有醒来的时候,到了四点多我干脆不睡了。去厕所复习了《红星照耀中国》。

考场就在本校,所以直接呆在学校复习。

学校饭堂早餐是方便面(差评)。吃完后就去机房复习。

中午去饭堂吃饭,饭堂大叔很亲切地给每个同学打了四份菜,很饱。说实话挺感谢这位大叔的,可以看出来他是真心地祝福我们取得好成绩。

饭后休息了一会就去考场准备了。

14:30准时发试题,初赛就正式开始了。


选择题略难,感觉比去年难,考场上目测错五题左右。

问题求解和阅读程序求解很水,很快就切完了,细心一点就能拿满分。

完善程序第二题双向链表程序感觉很难,但是空全部都可以根据对称性蒙对……

剩下时间都在刚不确定的题目,最后也没什么进展。

16:30,考试结束。


考后和同学一起对答案,发现选择题有一道智障水题粗心多错了,完善程序第一题把下标当数组用了……心态爆炸,不要脸地大呼没有90pts要凉。

晚上出参考答案了,忘了自己写的答案,估分77~83pts。


几天后初赛成绩出来了。

比估分高,87pts,估计是蒙对的比预想的要多一些。

后来了解到gd分数线是60出头,没想到比去年高这么多。

当然,今年初赛的分数线比去年高应该是因为完善程序可以蒙,如果留空留得刁钻一些,可能分数线会低很多。

总而言之,今年的初赛对我来说还算是有惊无险的了。接下来就要期待我复赛的表现了。

复赛

最后一周开始全力复习,文化课都没怎么管,这几天作业没全部完成过。(还好班主任没发现)

然而复习成果貌似不怎么样。

无论如何,复赛马上就要来了,就算没复习好也要硬着头皮上。

复赛前一天晚上也是住校,学校要求直接睡别人的宿舍……

凌晨三点被蚊子吵醒,打了两个小时的蚊子,到了五点多因为劳累过度而再次睡着。

真是愉快的一夜呢。


根本没睡多久所以今天一整天都没什么精神。

饭堂早餐还是方便面。大概七点就回到机房复习了。

考前几小时看完了ac过的题后,写了几个模板,然后就上大巴出发了。

在大巴上看《算法竞赛进阶指南》,dp部分实在看不懂(我太弱啦),只好认真看搜索,特别是剪枝部分。

没过多久,就来到了广州二中。

第一次来到这所学校,大感为什么和我校差距这么大……

广州二中伙食还不错,吃的很饱。

考前紧张到发抖,一直以喝水来压惊……

两点多钟到了试室,刚开始充满激情,结果被突如其来尿意憋没了(谁叫你之前喝那么多水)。

两点二十多分进入试室,监考员早早地写上了密码,看完后去上了厕所,发现这层楼好像只有一个男厕???

14:30准时开考,然后可能我这一年oi生涯里最惊心动魄的三个半小时就到来了。


开考后打开题目花了近五分钟。下意识点开c盘里找,一直都找不到比赛文件,最后还是用全局搜索查找文件名,才发现东西都在d盘里,解压密码输了三次才对,导致开考后五分钟我才拿到试题……

按照ccf得难度分布惯例,我打算t1t2做一题看一题,做完后看一遍t3t4再决定做哪一题。

可惜今年ccf,貌似并不按常规出牌。

t1一如既往的水,getline再遍历一遍输出即可。切掉后检查了很久,差不多10min才过掉这题。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

string s;
int ans;

int main()
{
    freopen("title.in", "r", stdin);
    freopen("title.out", "w", stdout);
    getline(cin, s);
    ; i < s.size(); ++i)
    {
        ') ++ans;
        else if(s[i] >= 'A' && s[i] <= 'Z') ++ans;
        else if(s[i] >= 'a' && s[i] <= 'z') ++ans;
    }
    cout << ans;
    ;
}

我的程序

t2大模拟,不过要注意一下精度问题以及分类讨论求解,还是考细心为主。

题目有点长,尽管全部分析完再写,也是边写边改(还是我太弱了)。大概写了20min然后测样例,没过,继续改,还是没过。最后改了快到15:20才改好,反复检查后就放心地去做剩下两题。

#include <iostream>
#include <fstream>
#include <cstdio>

#define MAX_N 100001

using namespace std;

int n, m;
long long a[MAX_N];
long long sum1, sum2;
int p1, p2;
long long s1, s2;
long long d;
inline  ? x : -x;}

int main()
{
    freopen("fight.in", "r", stdin);
    freopen("fight.out", "w", stdout);
    scanf("%d", &n);
    ; i <= n; ++i)
    {
        scanf("%lld", &a[i]);
    }
    scanf("%d%d%lld%lld", &m, &p1, &s1, &s2);
    a[p1] += s1;
    ; i < m; ++i)
    {
        sum1 += a[i] * (m - i);
    }
    ; i <= n; ++i)
    {
        sum2 += a[i] * (i - m);
    }
    p2 = m;
    d = abs(sum1 - sum2);
    ; i < m; ++i)
    {
        if(abs(sum1 + s2 * (m - i) - sum2) < d)
        {
            p2 = i;
            d = abs(sum1 + s2 * (m - i) - sum2);
        }
        else if(abs(sum1 + s2 * (m - i) - sum2) == d && i < p2)
        {
            p2 = i;
        }
    }
    ; i <= n; ++i)
    {
        if(abs(sum1 - sum2 - s2 * (i - m)) < d)
        {
            p2 = i;
            d = abs(sum1 - sum2 - s2 * (i - m));
        }
        else if(abs(sum1 - sum2 - s2 * (i - m)) == d && i < p2)
        {
            p2 = i;
        }
    }
    printf("%d", p2);
    ;
}

我的程序

感觉这次在前面两题花的时间有点长了,按照这个题目难度其实三点前就能切完。我切水题的能力还是有待提高。

看完后面两题题面之后,最先想到的就是t3用dp,t4除了暴搜+剪枝以外,没有任何思路,于是决定先做t3。(其实我应该先做t4才对,不知道当时脑子怎么就抽了)

t3方程不好想,本来刚开始想到解法,写了30min,突然想到反例,自己hack了自己,只好全部删掉。想了半天正解无果,就打算换思路骗分,写一个能拿50pts的dp。

写完之后又去乱搞优化,结果不知道是什么问题,各种莫名错误出现。一行一行代码注释去测哪里出错,还是测不出来,只能自己乱改。(其实我应该推掉重写才对)

在改的过程中,下意识看了表,发现现在都已经是16:49了!无法,只好先放弃肛这一题。

打算上厕所去放松心情,结果这层厕所又被人占了?当时就是不知道可以跨楼层上厕所,只好憋着继续考。

虽然上不了厕所,但我还是在门口外面想了一会t4,只想到暴力做法,就回试室去实现了。

花了30min去写t4的暴搜和小部分剪枝,其他剪枝因为时间问题来不及加,草草调试了一遍,看到过了两个小样例后随便测了大样例,也没认真看用时,没记错的话好像用了5s多……(可能真是我记错了)

#include <iostream>
#include <fstream>
#include <cstdio> 

#define MAX_N 1000001

using namespace std;

int n;
struct Node
{
    int val;
    int lt, rt;
    int num; // 以这个点为根的树的节点数量
}a[MAX_N];
;

void Get_Num(int x)
{
    a[x].num = ;
     && a[x].rt == -) return;
     && !a[a[x].lt].num)
    {
        Get_Num(a[x].lt);
        a[x].num += a[a[x].lt].num;
    }
     && !a[a[x].rt].num)
    {
        Get_Num(a[x].rt);
        a[x].num += a[a[x].rt].num;
    }
    return;
}

bool DFS(int x, int y)
{
    if(a[x].val != a[y].val) return false;
    if(a[x].num != a[y].num) return false;
     && a[y].num == ) return true;
     && a[x].rt != - && a[y].lt != - && a[y].rt != -)
    {
        if(!DFS(a[x].lt, a[y].rt)) return false;
        if(!DFS(a[x].rt, a[y].lt)) return false;
        return true;
    }
     && a[x].rt == - && a[y].lt == - && a[y].rt != -)
    {
        if(!DFS(a[x].lt, a[y].rt)) return false;
        return true;
    }
     && a[x].rt != - && a[y].lt != - && a[y].rt == -)
    {
        if(!DFS(a[x].rt, a[y].lt)) return false;
        return true;
    }
    return false;
}

int main()
{
    freopen("tree.in", "r", stdin);
    freopen("tree.out", "w", stdout);
    scanf("%d", &n);
    , ;
    ; i <= n; ++i)
    {
        scanf("%d", &a[i].val);
    }
    ; i <= n; ++i)
    {
        scanf("%d%d", &a[i].lt, &a[i].rt);
    }
    Get_Num();
    ; i <= n; ++i)
    {
         || a[i].rt == -) continue;
        if(DFS(a[i].lt, a[i].rt)) ans = max(ans, a[i].num);
    }
    printf("%d", ans);
    ;
}

我的程序

回头做t3,那个时候是17:42。遗憾的是,直到考试结束还是找不到t3程序莫名re的原因在哪,来不及重构代码了,只好把这个八成会爆0的代码交上去。

看了看窗外的黄昏,这景色就和自己的心境一样,整个人都更崩溃了。

最后10min,监考老师提醒,才发现有考生注意事项的文件,估计是开考的时候太急没看到。本来想问程序存到哪里,才发现是要放到d盘(汗)。

花了几分钟去检查文件名和测能否编译。搞完后只剩最后半分钟,平复了一下心情,估了一下分,感觉要凉,心态更炸了。

18:00,比赛结束。


出了试室和同学互探考得怎么样,跟同学说了我t3的情况,越说越觉得遗憾,最后还是不想说下去了。

上了返程的大巴,全程都有人在讨论t3,貌似有人想到正解了??

t3莫名错误搞得我很不是滋味,就因为它,这次我能否拿一等还是很悬。

考后自己估分,应该是100+100+0+(0~40)。只能坐等ccf出成绩了。

这次考不好的原因,当然还是我的实力不够强,特别是dp需要加强;其次搜索和贪心的话,因为骗分肯定会用到,所以也需要再去提高;还有最近新学的知识需要巩固的。

尽管t3错误异常,但如果我水平足够的话,其实是应该能找出缘由的,实在不行我也可以重写。这也提现了我考场策略也不怎么好。

至于考场策略不好,都是因为我的参赛经验不足。我的时间把控很不到位,前面三题花了太多时间(尤其是t3),导致t4根本没什么时间去想。我的其他方面的一些技巧也都需要去加强。

总的来讲,这次noip很好地诠释了一句话:技不如人,甘拜下风。

无论这次成功与否,该考完的已经考完了。

就这样吧。


考后第二天早上起来去洛谷自测,只交了三题,没交t3,结果全ac了,这数据太水了吧……

初征——NOIP2018游记

休息了一天再来想昨天的比赛,感觉心情好了很多。oi生涯中的第一次noip终于过去了。如果高中继续学下去的话,那也是只有四年的时间打oi了。进了竞赛这个圈子,收获了很多东西,在无数dalao面前,更加能感受到自己的渺小(弱)。在那么多从小学oi的人面前,我是毫无优势。若达到他们的高度,我还有非常多需要学习。

这次我是带着挑战ak虐场的心态来参加的,t3的dp狠狠打击了我,t4据说正解是manacher或hash,这我也根本不会。这次noip是深刻地让我意识到了我距离akpj还有多大差距。

本来打算考完这次,明年就去打tg。考成这样,明年直接参加tg估计是不可能的,应该还得继续打一年pj,希望明年能够如愿以偿。


过了几天后,ccf才公布选手程序了。

后来断断续续测了几个数据。

洛谷:100+100+10+100

学军:100+100+10+100

牛客:100+100+10+100

某大佬出的数据:100+100+35+80

本来测完前三个之后,自我感觉已经好了很多了,还真的开始有想着ccf的数据跟这上面的一样水的念头。结果在某大佬的数据下,t4re了五个点,感觉这样下去官方数据可能会re更多!现在我又慌了起来。


出成绩那天,中午没吃饭,赶着去机房查成绩,结果ccf咕了?害得我一天心情都不怎么好。

下午上电脑课,发现ccf改为明天出成绩……

第二天上午被老师叫出去,果然是ccf出成绩了。

rp爆炸,t4居然ac了,总共是100+100+5+100 = 305,在gd里也算是前几十名,应该是有一等奖了。初征——NOIP2018游记

如果要把这次的题目放在洛谷上的话,个人认为难度如下:

标题统计:红题(不解释)。

龙虎斗:橙题(只不过是细节需要注意罢了)。

摆渡车:蓝题(这dp真的好难QAQ)。

对称二叉树:绿题(数据太水,就是剪枝水题)。

(话说我考前看剪枝,结果t4真用到了剪枝,怕不是要被禁赛)


又过了很多天,ccf公布了奖项。

得知了自己拿了一等奖,虽然这已经是不出所料的了。gd省一线215pts,有点水了。

再回想这次noip,虽然对于我的真实水平来说,这次成绩是有点差了,但毕竟还是有一等奖而且是300+,遗憾也没有那么大了。

无论如何,noip2018已经结束了,让我们noip2019再见!