CSP-S 爆零退役记
背景图正中间下面,穿橙色衣服的是大佬 。
T1 出题人寿命为何只有十天,1582 年为何只有 355 天,闰年如何是也不是;动物园神秘饲养百万动物,是史前文明的复苏,还是外星文明的入侵,打工采购员竞一人购买数十万饲料,是资本主义的顶峰,还是未知阴谋的开端;加乘函数如何卡死数据库,千层嵌套到底从何而来;百万条蛇具有高等智慧,互相吞噬到底如何博弈,一蛇停止竟全体同意,是一致对外的团结,还是自然法则更大的阴谋,敬请收看
CSP-2020!
时间线
CSP-S 2020 - 2020/10/6
拿到一轮准考证
- 2020/10/11
第一轮比赛
- 2020/10/14
入选第二轮(1=)
- 2020/10/25
开始晚上回家复习
- 2020/11/8
第二轮比赛
- 2020/11/9
退役 - 2020/11/29
进入了 NOIP
坐标 SD,S 选手。
作为初四 OIer,我和 是 xt 的唯二初中选手。还有原来是同学的新高一们、高二们,还有个高三大佬。
总的来说,今年算是考垮了。
Day 2020-10-11
这一天正好是星期五,补课日。因此请了一上午的假。我寻思着,下午还要上课,书包也不好带着去比赛,就想出了一个绝妙的办法:把书包放在辅导班里,下午回来时直接去辅导班就可以啦!
然后,就坐着公交车赶往考试地点啦。公交车还差点没赶上。
不过,我到达时,都集合完毕入考场了。幸好我赶到时还能看到队尾。然后就愉快地考试啦。
还是去年的形式,全是选择题。
前 15 个选择题,没有什么难度。dijkstra 未优化版本时间复杂度是 啊啊啊,居然连这个都错了 \kk。
程序阅读题,前两个虽然有错的但是还行,第三个那 99 行的毒瘤代码实在是看不懂\kk。
完善程序题,不想说什么,因为 T2 全错。
然后 61.5 分爬了。
大佬也仅 64.5 分,不过还是我这个蒟蒻水平不高。高中大佬们个个 70~90 分。
不过还是入选了。
Day 2020-10-25
嗯,离开宿舍,投奔 OI。CSP-S 之前想着能多补一点是一点。
那个我的 boyfriend ()表示我离开后他非常高兴。
我只能说,哼。
Day -8
得知比赛日期,我直接慌了。luogu 网课仅看了 2 课不到,而且我什么各种树、dp 、数论都不会。
数学上来先打表,数论只会 gcd。
由于 luogu 网课看得很晚,到晚上 12 点。每天都与 sleepiness 做斗争(English Teacher 语),天天完不成作业。
幸好友善的老师和家长比较支持。
Day 0
这天是星期五,请了个假。
复习了一些知识(都没考),学习了一些 luogu 网课(都不会),颓了一些东西(没点用)。
把各种证准备了一下。
Day 1
Day 1 - 5:00-6:30
赶往 xtyz,坐上大巴车
- 6:30-10:30
车上,赶往日照
- 10:30-11:20
上!厕!所!
- 11:20-12:40
要么在吃饭,要么在吃饭的路上
- 12:40-13:50
RP++ 中
- 13:50-14:30
入场
- 14:30-18:30
被题虐
- 18:30-19:00
于人海中集合
- 19:00-22:00
滚回家
我们这个城市修路,所以用了一个小时找赶往 xtyz 的路。我都怀疑这交通是不是连通图。
还是跟着一个去往市区的运垃圾的车才找到的路。
来到 xtyz 门口,坐上大巴车。大巴车上,充满了大佬的空气。我和大佬 讨论了一些题后,实在很累,就在车上睡了。还从窗外看到了来自湖北的车呢。
路上,大佬 出了个数学题:
a+b+gcd=lcm (a>b 为整数)
a<lcm<3a
lcm=2a
gcd*lcm=ab
gcd*2a=ab
gcd=b/2
a+3b/2=2a
a=3b/2
到了大学门口,首先进来一个上撤硕之旅。然后上完撤硕就恰饭。食堂里的菜可是比我的学校里的垃圾食堂好多了,有各种菜,什么脆皮鸡盖饭、麻辣烫、米线、木桶饭之类的。
然后就是临阵磨枪
立个 flag:T1 20-30min 切掉,T2 1-2h 切掉,T3 和 T4 打暴力。然后,我才发现,事情没这么简单(详见下文)。
开始入考场。我旁边坐着一个像是上小学的大佬,才觉我快挤出单调队列了。比赛时听到他在赞美出题人。先是试机。打了个死循环、死递归,电脑没问题。然后开始打命名空间了,可以防止变量名冲突。我的学长有用 clock 做变量名而 CE 的惨痛经历。
密码差评!!!都分不清O
和0
,l
和I
和1
,而且外层的括号也是密码的一部分!!!
解压看题。这四题看完,我有些慌,这些题是比去年的 CSP-J 难得多的。我想,骗骗分,正常发挥就好了。
- T1
- T2
- T3
- T4
估分:[30,60]
。
luogu:40。
官方:40。
在T1这个毒瘤大模拟上花费太长时间(2.5h)了。还是要加强模拟能力啊。
首先看到这个题,哇,大模拟。开始死磕这个题,不知不觉时间过去了 1h。看了看时间,现在连小样例都没调出来,开始紧张了。还是太菜。
这个题,我是采用暴力模拟,从0枚举儒略日。先枚举年,再枚举月,再枚举日。所以 TLE 了,大样例过不了。而且,样例二三比我的程序输出结果都少一天,很玄学。最后心态崩了,做别的题。
前有格雷码,今有儒略日(fqt语)。
考场代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
namespace yz
{
const int yes=1,no=2,err=3;
const int year=1,month=2,day=3,jul=4;
const int monthes[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
const int rmonthes[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
long long ny,ans[10];
int checkgy(long long check[])
{
if(check[year]<1) return no;
return yes;
}
int checkba(long long check[])
{
if(check[year]<1582) return no;
if(check[year]==1582&&check[month]<10) return no;
if(check[year]==1582&&check[month]==10&&check[day]<=4) return no;
if(check[year]>1582) return yes;
if(check[year]==1582&&check[month]>10) return yes;
if(check[year]==1582&&check[month]==10&&check[day]>=15) return yes;
return err;
}
int checkrn(int type,long long check)
{
check=abs(check);
if(type==no)
{
if(check%4==1) return yes;
}
if(type==yes)
{
if(check%400==0) return yes;
if(check%4==0 && check%100!=0) return yes;
}
return no;
}
void solve()
{
int isrn,rntype,nowadd;
while(true)
{
nowadd=365;rntype=checkba(ans);isrn=checkrn(rntype,ans[year]);
if(isrn==yes) nowadd=366;
if(ans[year]==1582) nowadd-=10;
if(ans[jul]+nowadd <= ny)
{
ans[jul]+=nowadd;
ans[year]++;
if(ans[year]==0) ans[year]=1;
}
else break;
}
rntype=checkba(ans);isrn=checkrn(rntype,ans[year]);
while(true)
{
if(isrn==yes) nowadd=rmonthes[ans[month]];
else nowadd=monthes[ans[month]];
if(ans[jul]+nowadd <= ny)
{
ans[jul]+=nowadd;
ans[month]++;
}
else break;
}
while(true)
{
if(checkba(ans)==err)
{
ans[day]=15;
}
if(ans[jul]+1 <= ny)
{
ans[jul]++;
ans[day]++;
}
else break;
}
if(checkgy(ans)==no)
printf("%lld %lld %lld BC\n",ans[day],ans[month],-ans[year]);
else
{
ans[day]++;
if(isrn)
{
if(ans[day]>rmonthes[ans[month]]) ans[month]++,ans[day]=1;
if(ans[month]>12) ans[year]++,ans[month]=1;
}
else
{
if(ans[day]>monthes[ans[month]]) ans[month]++,ans[day]=1;
if(ans[month]>12) ans[year]++,ans[month]=1;
}
printf("%lld %lld %lld\n",ans[day],ans[month],ans[year]);
}
}
void yzmain()
{
int Q;
scanf("%d",&Q);
for(int Query=1;Query<=Q;Query++)
{
ans[year]=-4713;
ans[month]=1;
ans[day]=1;
ans[jul]=0;
scanf("%lld",&ny);
solve();
}
return;
}
}
int main()
{
freopen("julian.in","r",stdin);
freopen("julian.out","w",stdout);
yz::yzmain();
return 0;
}
/*1721424 1721423*/
估分:0。
luogu:5。
官方:0。
T2 考场没好好看题,以为又是什么 dp 之类的。而且题面写得又长又迷。花了 10 min 还没读懂题,然后跳过,做T3。
最后,T2 我直接放弃了,第一是时间不够,第二这个题看上去很复杂。做本题时还有 15 min,因此只输出 0 骗点分。听大佬们说,这个题是最简单的,应放在 T1 的位置。我听到他们这么一说,心态完全炸裂。
考场代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
namespace yz
{
const int MAXN=1000000+10,MAXQ=100000000+10;
int n,m,c,k,p[MAXN],q[MAXQ];
unsigned long long a[MAXN];
void yzmain()
{
scanf("%d%d%d%d",&n,&m,&c,&k);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=m;i++)
scanf("%d%d",&p[i],&q[i]);
printf("0");
return;
}
}
int main()
{
freopen("zoo.in","r",stdin);
freopen("zoo.out","w",stdout);
yz::yzmain();
return 0;
}
估分:[0,30]。
luogu:0。
官方:0。
暴力滚粗。虽然我看出来这是图论题。由于看了看 T4 ,题面很清新,也将本题跳过了。
在测样例时,我的电脑差点崩溃(由于暴力,有递归函数)。试机结果骗了我。要不是我存盘了,否则后果不堪设想。看了看数据,有 C 的和等于 0 的数据点。我想,这不就是没有调用函数吗。于是写了骗分代码。事实证明,写挂了。
这里顺便说两句,有时编译时 Dev-c++ 会卡死,不仅是这道题。它卡的时候,生怕电脑蓝屏,然后代码白写了。
考场代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
namespace yz
{
const int MAXN=100000+10,mod=998244353;
int n,a[MAXN],m,t[1000+10][1500],q,ch[MAXN][10];
void fun(int num)
{
if(t[num][0]==1)
a[t[num][1]]=(a[t[num][1]]+t[num][2])%mod;
else if(t[num][0]==2)
for(int i=1;i<=n;i++) a[i]=(a[i]*t[num][1])%mod;
else
for(int i=1;i<=t[num][1];i++) fun(t[num][i+1]);
}
void cheat(int num)
{
if(ch[num][0]==1)
a[ch[num][1]]=(a[ch[num][1]]+ch[num][2])%mod;
else if(ch[num][0]==2)
for(int i=1;i<=n;i++) a[i]=(a[i]*ch[num][1])%mod;
else return;
}
void yzmain()
{
int tmp;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
if(n>1001&&m>1001)
{
for(int i=1;i<=m;i++)
{
scanf("%d",&ch[i][0]);
if(ch[i][0]==1)
scanf("%d%d",&ch[i][1],&ch[i][2]);
else if(ch[i][0]==2)
scanf("%d",&ch[i][1]);
else
scanf("%d",&ch[i][1]);
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d",&tmp);
cheat(tmp);
}
for(int i=1;i<=n;i++)
printf("%d ",a[i]%mod);
return;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&t[i][0]);
if(t[i][0]==1)
scanf("%d%d",&t[i][1],&t[i][2]);
else if(t[i][0]==2)
scanf("%d",&t[i][1]);
else
{
scanf("%d",&t[i][1]);
for(int j=1;j<=t[i][1];j++)
scanf("%d",&t[i][j+1]);
}
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d",&tmp);
fun(tmp);
}
for(int i=1;i<=n;i++)
printf("%d ",a[i]%mod);
return;
}
}
int main()
{
freopen("call.in","r",stdin);
freopen("call.out","w",stdout);
yz::yzmain();
return 0;
}
估分:[20,55]。
luogu:10。
官方:20。
看了看这个关于甜点蛇的题,题面简单易懂(个XX!),为出题人点赞!然后开始模拟。
先拿到 的 10 分数据。然后,不知道为什么,剩下的样例总是和我的程序输出差一。心态崩了。在赛后的 luogu 自测上就 WA 了。
考场代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
namespace yz
{
const int MAXN=1000000+10;
int n,a[MAXN];
struct snake{int num,hp;};
bool cmp(snake a,snake b)
{
if(a.hp==b.hp)
return a.num<b.num;
return a.hp<b.hp;
}
void solve20()
{
if(a[3]-a[1]<a[2])
printf("%d\n",3);
else
printf("%d\n",1);
return;
}
void solve40()
{
int ans=n;
snake s[20];
for(int i=1;i<=n;i++)
s[i]=(snake){i,a[i]};
sort(s+1,s+1+ans,cmp);
while(true)
{
if(s[ans].hp-s[1].hp>=s[2].hp)
s[1].hp=s[ans].hp-s[1].hp,s[1].num=s[ans].num,ans--;
else break;
sort(s+1,s+1+ans,cmp);
}
printf("%d\n",ans);
}
void solve55()
{
int ans=n;
snake s[2000+10];
for(int i=1;i<=n;i++)
s[i]=(snake){i,a[i]};
sort(s+1,s+1+ans,cmp);
while(true)
{
if(s[ans].hp-s[1].hp>=s[2].hp)
s[1].hp=s[ans].hp-s[1].hp,s[1].num=s[ans].num,ans--;
else break;
sort(s+1,s+1+ans,cmp);
}
printf("%d\n",ans);
}
void yzmain()
{
int T,t1,t2;
scanf("%d",&T);
for(int data=1;data<=T;data++)
{
scanf("%d",&n);
if(data==1)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
}
else
{
for(int i=1;i<=n;i++)
scanf("%d%d",&t1,&t2),a[t1]=t2;
}
if(n==3) solve20();
if(n>3&&n<=10) solve40();
if(n>10&&n<=2000) solve55();
}
return;
}
}
int main()
{
freopen("snakes.in","r",stdin);
freopen("snakes.out","w",stdout);
yz::yzmain();
return 0;
}
/*1 5
7 10 24 48 50*/
/*
7 10 24 48 50
1 2 3 4 5
10 24 43 48
2 3 5 4
24 38 43
3 4 5
*/
考完试,我快速的挤出人群,艰难地集合。(在集合路上,还听到大佬讲 T1 做法,我直接 orz)
上了车, 说他最多考 40 分。这就是 fake。和 闲聊一会后,就在车上睡了。
回到家,感觉今天什么也没发生。
Day 2
源程序下发,luogu 估分。总分才 55,心态直接成渣了。
然后又要补万恶的文化课作业。
Day 7
老师看到我在 QQ 空间发的成绩,评论:这个成绩肯定能晋级。
Day 2020-11-29
官方成绩:60。
然后,我就凭着 60 分的成绩晋级了 NOIP。(实际上只要得分就能晋级,好像有的 0 分也能进)
然后,即将会写 NOIP-2020 游记。
总结
这次比赛,可以说,我失败了。我认为,原因如下:
- 网课看得少,并且,网课讲的东西大部分没考(客观)。
- 时间分配不恰当。T1 这个毒瘤题花了我 2.5h ,导致错失了 AC T2 的机会。
- 太菜。几乎都打的暴力。
NOIP 2020,RP++!
第三人称游记
“再多看一个模板吧。”小女孩在考场外,端着手机,孤苦伶仃地站着,周围的人熙熙攘攘,他们都有说有笑,仿佛做足了准备,只有这个考 csp 的小女孩因紧张而瑟瑟发抖。
进考场了。她来到自己的座位坐下,周围都是大佬,旁边好像还是一个小学生。她一坐下就立马打开 dev-cpp 试机,希望可以在试机时间到之前保证电脑没问题。她凭着笨拙的操作打了个死递归,看到电脑没多大问题,松了一口气,开始打自己的命名空间了。命名空间可以防止变量名冲突。她始终铭记着她学长的话,“不要用 clock 什么的做变量名。”
题目解压密码已经投放在大屏幕上了,长时间熬夜的她视力并不是很好,不过幸好投放的解压密码的字体很大。她把它打在记事本上,再复制到压缩包里,密码错误,小女孩的心一下子悬了起来,她又一遍一遍地看密码,再和自己打的一一对比,可她找不到一点错误,密码错误的窗口又一次弹了出来,她的脸火辣辣的。她想找监考人员来帮一下忙,可她太害羞了。她看了看周围的人,他们好像也没解压成功,她又把手放下了,再一遍遍地比对,密码错误。终于,监考人员解释了O
和0
,l
和I
和1
的区别,以及外层的括号也是密码的一部分。小女孩成功地解压了试题,长叹了一口气。
映入眼帘的是四个文件夹和一个 pdf。她先按照题目名称建立四个 cpp,写好命名空间,写好 freopen。她始终铭记着她教练的话,“要把题目看完。”她一点一点的浏览着题目。第一题,模拟,她倒吸了一口气。这个题太毒瘤了,题面这么长,没细看就去看下一题了。这四题看完,她的心变得有些慌乱,好像都没有什么思路。“但愿能 A T1,别的题骗点,正常发挥就好了。”
她先死磕 T1。她看着儒略历。历史课上,老师讲过十月革命,实际发生在十一月。她又回过神来,一点一点地写各种判断闰年、公元、1582年10月的函数,再开始枚举年月日。啊,代码终于打完了,仿佛攥住了100分,她踏实地编译了 T1,样例没过。她的心就像寻求着低处的玻璃一样,跳向了大地,然后碎成一片。一次次地调试,一次次地输出中间结果,可还是没有调出来。两小时过去,终于过了样例。她满怀期望地测试大样例,TLE!她开始优化她的程序。她看着一点一点飞逝的时间,又急了起来,“不要死磕一道题。”她学长的话又浮现在她耳边。
看T4吧,还有一个半小时呢,她安慰道。T4 先骗部分分,打的很顺。按照她的想法,T4码出来了,两个小样例也过了,她可算放心了。“应该总分至少 100 分吧。”她赶紧回去看 T1,把大样例的前几个数据测了一下。“运行得这么慢?”她瞪大了眼睛,想了想,看来要进行时间复杂度上的优化了。
还有一个小时,她必须抉择,是去做 T2、T3 还是优化 T1。最终,她先按照题意模拟 T3,再磕 T1,毕竟 T1 优化一下就可能 AC,并且 T2 看起来很难。T2 她选择输出 0。
代码越码越长,码的全是取模什么的,还是很慢,她看着 T1 的数据规模,叹了口气,看来只能拿 40 分左右。时间在飞逝,她无论怎么优化还是不行,“去骗分吧。”
她放弃了T1,打开了 T3 的大样例,电脑竟卡死了。这个时候可不能死机啊!幸好一会儿恢复正常。“T3 好像是图论,不过先打下暴力分。要达到 100 多分,再骗一点就 OK 了。”她心里想。
时间,还有三十分钟。测试T4,她点开输出,发现自己的输出有时候大1,她感到奇怪。“手动模拟吧。”可她一点开大样例,两千条蛇!进行八百轮!天呐,这两千条蛇仿佛爬进了她的心里,搅动着不能再浑浊的水,还有三十分钟哪能让她手动模拟呢?就算是按代码调,时间也不够啊!小女孩着急了起来,她怕,她恨,她也后悔,每天熬夜、周六请假的结果,难道是这等地步?她不甘,绞尽脑汁地想,不断输出中间变量,不断改着细节。手,在抖,printf 打错了好几次。
时间,还有十五分钟.监考老师突然宣布,提前五分钟提交。她慌了,她必须交题了。拿着只能过样例的 T4,和 TLE 的 T1,纯暴力的 T3,输出 0 的T2,反复检查文件,她交了上去。一百多分的目标,只能听天由命了。离开考场,她快速的挤出人群,她听到人群中有大佬讲 T1 的做法,但她不敢细听,因为无论说什么也只能伤她的心。
在归途中,她和大佬 zzy 讨论这场比赛的感受。
第二天,源程序下发,luogu 自测。
55 分。
小女孩哭了。
本文作者:Yurchiu
本文链接:https://yz-hs.github.io/d763983a2feb/
版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。