Yurchiu's Blog

CSP-S1&2 游记

Yurchiu 2020-11-08, 15:50:43 5.3k 隐藏左右两栏 展示左右两栏

CSP-S 爆零退役记

背景图正中间下面,穿橙色衣服的是大佬 zzy\tt{\color{black}{z}\color{red}{zy}}

T1 出题人寿命为何只有十天,1582 年为何只有 355 天,闰年如何是也不是;动物园神秘饲养百万动物,是史前文明的复苏,还是外星文明的入侵,打工采购员竞一人购买数十万饲料,是资本主义的顶峰,还是未知阴谋的开端;加乘函数如何卡死数据库,千层嵌套到底从何而来;百万条蛇具有高等智慧,互相吞噬到底如何博弈,一蛇停止竟全体同意,是一致对外的团结,还是自然法则更大的阴谋,敬请收看

CSP-2020

时间线

  1. CSP-S 2020
  2. 2020/10/6

    拿到一轮准考证

  3. 2020/10/11

    第一轮比赛

  4. 2020/10/14

    入选第二轮(1=)

  5. 2020/10/25

    开始晚上回家复习

  6. 2020/11/8

    第二轮比赛

  7. 2020/11/9

    退役

  8. 2020/11/29

    进入了 NOIP

坐标 SD,S 选手。

作为初四 OIer,我和 zzy\tt{\color{black}{z}\color{red}{zy}} 是 xt 的唯二初中选手。还有原来是同学的新高一们、高二们,还有个高三大佬。

总的来说,今年算是考垮了。

Day 2020-10-11

这一天正好是星期五,补课日。因此请了一上午的假。我寻思着,下午还要上课,书包也不好带着去比赛,就想出了一个绝妙的办法:把书包放在辅导班里,下午回来时直接去辅导班就可以啦!

然后,就坐着公交车赶往考试地点啦。公交车还差点没赶上

不过,我到达时,都集合完毕入考场了。幸好我赶到时还能看到队尾。然后就愉快地考试啦。

还是去年的形式,全是选择题。

前 15 个选择题,没有什么难度。dijkstra 未优化版本时间复杂度是 O(n2)O(n^2) 啊啊啊,居然连这个都错了 \kk

程序阅读题,前两个虽然有错的但是还行,第三个那 99 行的毒瘤代码实在是看不懂\kk。

完善程序题,不想说什么,因为 T2 全错

然后 61.5 分爬了。

zzy\tt{\color{black}{z}\color{red}{zy}} 大佬也仅 64.5 分,不过还是我这个蒟蒻水平不高。高中大佬们个个 70~90 分。

不过还是入选了

Day 2020-10-25

嗯,离开宿舍,投奔 OI。CSP-S 之前想着能多补一点是一点。

那个我的 boyfriend (zyx\tt{\color{black}{z}\color{red}{yx}})表示我离开后他非常高兴。

我只能说,

Day -8

得知比赛日期,我直接慌了。luogu 网课仅看了 2 课不到,而且我什么各种树、dp 、数论都不会。

数学上来先打表,数论只会 gcd。

由于 luogu 网课看得很晚,到晚上 12 点。每天都与 sleepiness 做斗争(English Teacher 语),天天完不成作业

幸好友善的老师和家长比较支持。

Day 0

这天是星期五,请了个假。

复习了一些知识(都没考),学习了一些 luogu 网课(都不会),颓了一些东西(没点用)

把各种证准备了一下。

Day 1

  1. Day 1
  2. 5:00-6:30

    赶往 xtyz,坐上大巴车

  3. 6:30-10:30

    车上,赶往日照

  4. 10:30-11:20

    上!厕!所!

  5. 11:20-12:40

    要么在吃饭,要么在吃饭的路上

  6. 12:40-13:50

    RP++ 中

  7. 13:50-14:30

    入场

  8. 14:30-18:30

    被题虐

  9. 18:30-19:00

    于人海中集合

  10. 19:00-22:00

    滚回家

我们这个城市修路,所以用了一个小时找赶往 xtyz 的路。我都怀疑这交通是不是连通图

还是跟着一个去往市区的运垃圾的车才找到的路。

来到 xtyz 门口,坐上大巴车。大巴车上,充满了大佬的空气。我和大佬 zzy\tt{\color{black}{z}\color{red}{zy}} 讨论了一些题后,实在很累,就在车上睡了。还从窗外看到了来自湖北的车呢

路上,大佬 zzy\tt{\color{black}{z}\color{red}{zy}} 出了个数学题:

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

到了大学门口,首先进来一个军装小哥哥给我们量体温。车上实在太热,我们就都下车了,然后进行了将近一个小时的上撤硕之旅。然后上完撤硕就恰饭。食堂里的菜可是比我的学校里的垃圾食堂好多了,有各种菜,什么脆皮鸡盖饭、麻辣烫、米线、木桶饭之类的。

然后就是临阵磨枪膜强了。我看着 luogu 网课,再看看模板,但好像没什么用。

立个 flag:T1 20-30min 切掉,T2 1-2h 切掉,T3 和 T4 打暴力。然后,我才发现,事情没这么简单(详见下文)。

开始入考场。我旁边坐着一个像是上小学的大佬,才觉我快挤出单调队列了。比赛时听到他在赞美出题人口吐芬芳。先是试机。打了个死循环、死递归,电脑没问题。然后开始打命名空间了,可以防止变量名冲突。我的学长有用 clock 做变量名而 CE 的惨痛经历。

密码差评!!!都分不清O0lI1,而且外层的括号也是密码的一部分!!!

解压看题。这四题看完,我有些慌,这些题是比去年的 CSP-J 难得多的。我想,骗骗分,正常发挥就好了。

  • T1
  • T2
  • T3
  • T4
以最诚挚的心意向至高的 S 组 T1 出题人(`1582.10.5 ~ 1582.10.14`)亲人提出最诚挚的问候。祝您的外公的女儿壮烈牺牲。

估分:[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!),为出题人点赞!然后开始模拟。

先拿到 n=3n=3 的 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)

上了车,zzy\tt{\color{black}{z}\color{red}{zy}} 说他最多考 40 分。这就是 fake。和 zzy\tt{\color{black}{z}\color{red}{zy}} 闲聊一会后,就在车上睡了。

回到家,感觉今天什么也没发生。

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++!

希望明年,不要再带着遗憾,来写游记了!\Large{\color{red}{\text{希望明年,不要再带着遗憾,来写游记了!}}}

第三人称游记

“再多看一个模板吧。”小女孩在考场外,端着手机,孤苦伶仃地站着,周围的人熙熙攘攘,他们都有说有笑,仿佛做足了准备,只有这个考 csp 的小女孩因紧张而瑟瑟发抖。

进考场了。她来到自己的座位坐下,周围都是大佬,旁边好像还是一个小学生。她一坐下就立马打开 dev-cpp 试机,希望可以在试机时间到之前保证电脑没问题。她凭着笨拙的操作打了个死递归,看到电脑没多大问题,松了一口气,开始打自己的命名空间了。命名空间可以防止变量名冲突。她始终铭记着她学长的话,“不要用 clock 什么的做变量名。”

题目解压密码已经投放在大屏幕上了,长时间熬夜的她视力并不是很好,不过幸好投放的解压密码的字体很大。她把它打在记事本上,再复制到压缩包里,密码错误,小女孩的心一下子悬了起来,她又一遍一遍地看密码,再和自己打的一一对比,可她找不到一点错误,密码错误的窗口又一次弹了出来,她的脸火辣辣的。她想找监考人员来帮一下忙,可她太害羞了。她看了看周围的人,他们好像也没解压成功,她又把手放下了,再一遍遍地比对,密码错误。终于,监考人员解释了O0lI1的区别,以及外层的括号也是密码的一部分。小女孩成功地解压了试题,长叹了一口气。

映入眼帘的是四个文件夹和一个 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/

版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。


By Yurchiu.
其他物件杂物收纳
Hitokoto

Yurchiu 说,除了她以外的人都很强!嘤嘤嘤~~
博客信息
文章数目
158
最近更新
08-21
本站字数
350.6k
文章目录