Away From OI(AFO) ,本以为远在天边,却忽然近在眼前
PS:不要关注这个帖子的时间,因为博客搭建得比较晚,所以这篇是后来誊抄过来的
赛前
中午 $12$ 点多出校门时,我还是满怀着热血与激情的。
心想着,这几天这么努力地打模板,背代码,复习原来的程序,应该会在赛场上考出个不错的成绩。
还记得上一次打 $CSP-J$ 复赛,学了不到一年的我拿到了 $80$ 分 的好成绩 。因此这次我定下了一个底线目标:这次打 $S$ 组,成绩必须比上一次打 $J$ 组高。我认为经过一个暑假再加两个月的集训,达成这个小目标应该不难。
事实证明,确实不难。(哭
T1
开考后,$T1(lock)$ 这道大水题的题面我竟然看了整整 $20$ 多分钟。是的,我无法相信这道题有看上去的那么简单,就一直在找题目中设下的陷阱。不敢相信我当时找漏洞的决心居然是如此坚定。
$20$ 分钟后,我确定了这道题没有任何坑,就是一道签到题,于是花了大概 $15$ 分钟切掉了。后面又调了一会儿,也没花多久。但是在调试过程中,我注释掉了文件操作。读者不要惊讶,我非常不习惯开文操调试,我喜欢在编译器弹出的窗口里完成这个工作。显然,对于 $OIer$ 来说,这并不是一个好习惯,我后面的经历也会证实这一点。它隐藏在我脑海深处最不为人知的角落,在那没有阳光的积灰的地方,却在这个关键时刻给了我最致命的一击。
开考大概 $45$ 分钟后,我开始对第二题 $(game)$ 发起进攻。看到这道题的第一眼就想到了可能可以用 $dp$ 做,但在暴打了 $1h$ 后毫无结果。赛后我知道,这道题不是不能 $dp$ ,但正解不是。而我却一直瞅着满分,还要揪着 $dp$ 不放,于是做了很多无用功。或许,我在看题时就不因该直接去想正解,那里水太深,以我的实力把握不住。赛前老师曾经讲过(具体是在那天讲的我忘了)不要一看题就去想正解,要学会拿部分分,要学会骗分,但显然我并没有把这些话真正放在心上。
现在,考试时间已经过了一半。
T2
我开始打 $T2$ 的暴力,想到了用栈这个数据结构维护,最后 $O(N^3)$ 的暴力确实也被我打出来了。但那时我没有多想,事实上,我的三重循环中有一重完全是无用的循环。用栈可以把复杂度降到 $O(N^2)$ ,可以比暴力算法多对好几个点。可这个机会也没有被我把握住,直到最后还是交上去了一个用栈“优化”的和暴力复杂度相同的代码。
把暴力调完时,一坤 $2.5$ 个小时已经过去了。
当时的我没有感觉到不安,因此选择了:
$T3 ,启动!$
$T3(struct)$ 是一道大模拟。想到我曾经在做一道大模拟时说考前这这种题既费时又没用,真是让人啼笑皆非。
果不其然,在我丧心病狂地写了一堆 $STL$ 后,在我几乎没有任何大模拟经验的加持下,我写了一个多小时,只写出了一个因为常数过大而自测直接 $T$ 掉的 $O(N^3log^2N)$ 的做法。
问:如何体会我在当时的心情?
答:想象一下一个代码,在自己造的最大的那个点最快跑了 $1001ms$ (注意,是测了好久测出来的最快的时间,开了 $O2$ ),并且题目没有部分分的情况下的心情。
于是,为了不让我这道题不爆零,我面向特殊数据编程,希望在全部血红色的 $TLE$ 中可以留下一个绿色的 $AC$。
打完之后,我甚至来不及自查,时间已经只剩不到 $10min$ 了
T4
显然,在这种情况下再开 $T4(tree)$ 已不可能。
我就去检查代码了。
我的初中老师曾经对我有一句锐评:我在考场上经常检查不出任何东西,甚至是最明显也最致命的错误。 这个时刻马上就要来了。
最后10分钟
首先,我将所有代码都保存了一遍。
随后,我先查了 $T1$ ,发现除了文操以外没有代码上的错误。于是我删掉了文操前的注释。然后,我去查了 $T2$ ,也没有肉眼可以识别的错误。$T3$ 我也来不及管了,因为此时仅剩不到 $3min$ ,调试也应该来不及了。
我松开了鼠标。老师在临出发前给了我们一些零食,这会儿我肚子也是真饿了,于是拆开饼干包装吃了起来。一直吃到结束。
当老师通知我们结束时,我叉掉了桌面上的所有开着的窗口。在关闭 $dev-c++$ 时,弹出来一条不起眼的提示。当时的我很想找同考场的同学ytc交流一下感受,因此根本没多想就下意识地随便点了一下。
事实证明,当你没有彻底离开考场,进入外面的世界时,你绝对不能有一丝的松懈,哪怕已经到了最后时刻。
小小的细节,确实能决定成败。
赛后
直到老师告诉我我 $T1$ 文操的注释没删(其实是删了但没保存)时,我才意识到了事情的严重性。
在这之前,我还认为我怎么着也得有个 $100$ 分,说不定 $T3$ 数据水一点还能争取上一等线。在这之前,我还以为文件错误这种东西除了模拟赛中可能会因为疏忽出现(对此我们班的另一位同学qyc很有发言权)。
当这一切真正发生时,眼前的一切仿佛都已幻灭。我没有夸张,虽然这种感觉没有持续很久。事实上,我向来对于此类事看得比较开,可能是我并没有感受过连续很长一段时间考砸时的绝望。回到教室后,我发烧了(请别笑,这绝对是真的,虽然前后好像并没有因果关系)。
这下,我的得分就仅剩 $40$ 分左右了,也可能不会有 $NOIP$ 的名额给我了。
或许,我该 $AFO$ 了。
回首往事
既然要 $AFO$ 了,那就应该回忆一下学 $OI$ 的经历了。
我学习 $OI$ 的总时长不超过两年,在初一时入的坑。那时作为刚接触 $OI$ 的蒟蒻,我有一种如鱼得水的感觉——那时的课程难度低得就像马里亚纳海沟,完全可以轻松掌握。之后,我独立完成了一款 $c++$ 小游戏(相信不少 $OIer$ 都写过),还与同学合作写过一些比较抽象的大程序(类似于人机互骂),这更是加深了我对 $OI$ 的兴趣。
知道学得越来越深,做的题目越来越难,我才认识到问题的严重性。
或许突然的转变转不过来,自从学习的难度上升到了一个阈值,我便开始了摆烂。题目抄代码,上课打游戏,还拉上全班同学一起打。那时老师教的很多算法、技巧已经忘得一干二净,几乎没有一丁点儿残余。
这样的班去打 $CSP$ ,结果可想而知。$2021$ 年 $CSP-J$ ,仅仅是初赛就把我们打得溃不成军,只有我侥幸以比分数线高 $0.5$ 的成绩进入了复赛。复赛自然也是相当惨烈。
自此,我的兴趣已经逐渐被消磨得不剩多少了。
初二初三那两年,信奥班因为学习压力的影响停办了。在这两年里,我仅剩的一点知识被忘了个精光。居然还记得住 $c++$ 的基本语法,那简直是奇迹。
初三暑假。
考完中考后,我终于记起信奥这档事。刚好暑假里高中学校组织集训,我便在恶补了一些知识以后报名了。接下来的两个多月我倒像是重拾了对 $OI$ 的兴趣,坚持着学了下去。直到今天,这条路一眼就看到了头。
休言万事转头空,未转头时是梦。
回忆了一番之后,我感到了后悔。但我不准备为自己开脱。不管怎么说,代码是我自己写的,分数是我自己注释掉的,考试对于我是公平的,我也没什么好怨天尤人的,这虽然不应该,但终究是我自己造就了这一切。接下来要做的,只有承担。
只有自己咽下自己的悔恨与不甘。
想起了老师在训练时贴的一句话:打败我们的不是未知的东西,而是你以为已知的东西。
那个训练我根本没怎么看(逃) ,知道今天,我才理解这句话的重量。
结语
或许这篇游记(退役记)太过于伤感,但这确实契合我此时的心情。
其实,我本来也就没有准备靠 $OI$ 冲进高校。我所能期待的,也只是一次 $S$ 组或 $NOIP$ 的好成绩罢了,这样就可以心安理得地结束 $OI$ 生涯,不留遗憾地放下,或是为我今后成为一名开发者做铺垫。如果是这样 $AFO$ ,实在是……
我要为我自己默哀,然后祈祷今年能像去年一样非 $0$ 分即可上 $NOIP$ 。即使这种希望非常渺茫。
如果我真的能够复役,我还会写一篇复役记。我会继续随队正常训练,直到最后审判的那一天。
update1:我得到了HG唯一一个复活币(教师推荐名额),我复役了
update2:我拿到了NOIP浙江省一
贴代码
其实没什么好帖的了,但还是要放一下。
毕竟说不定以后就没机会了。
$T1$
#include<bits/stdc++.h>
using namespace std;
int a[10][6],b[6];
int n;
long long ans;
int check()
{
int flag=1;
for(int i=1;i<=n;i++)
{
int cnt=0;
vector<pair<int,int > > wrong;
for(int j=1;j<=5;j++)
{
if(b[j]!=a[i][j]) cnt++,wrong.push_back(make_pair(j,(10-a[i][j]+b[j])%10));
}
if(cnt>2||cnt==0)
{
flag=0;
break;
}
else if(cnt==2)
{
if(abs(wrong[1].first-wrong[0].first)!=1||wrong[1].second!=wrong[0].second)
{
flag=0;
break;
}/*
else
{
for(int i=1;i<=5;i++) cout<<b[i]<<" ";
cout<<endl;
}*/
}
}
return flag;
}
int main()
{
//freopen("lock.in","r",stdin);看看这两行注释吧
//freopen("lock.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) for(int j=1;j<=5;j++) scanf("%d",&a[i][j]);
for(int i1=0;i1<=9;i1++)
{
for(int i2=0;i2<=9;i2++)
{
for(int i3=0;i3<=9;i3++)
{
for(int i4=0;i4<=9;i4++)
{
for(int i5=0;i5<=9;i5++)
{
b[1]=i1,b[2]=i2,b[3]=i3,b[4]=i4,b[5]=i5;
if(check()) ans++;
}
}
}
}
}
printf("%lld",ans);
//cerr<<clock();
return 0;
}
$T2$ 仅贴暴力的栈写法,因为那个 $dp$ 没有实际意义。
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int n;
long long ans;
char a[N];
bool check(int l,int r)
{
stack<char> s;
stack<char> k;
for(int i=r;i>=l;i--) k.push(a[i]);
while(!k.empty())
{
int u=k.top();
k.pop();
if(s.empty()) s.push(u);
else
{
if(s.top()==u) s.pop();
else s.push(u);
}
}
return s.empty();
}
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d",&n);
scanf("%s",a+1);
//if(n<=8000)
//{
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
int len=j-i+1;
if(len%2==1) continue;
else if(check(i,j))
{
ans++;
}
}
}
printf("%d",ans);
//}
return 0;
}
$T3,T4$ 不想贴了。