CSP-S 2025 游寄

· · 生活·游记

初赛部分

Day 1

由于根本没有进行复习所以直接Day1了吧。

初赛在外高考,而且考场和我22年第一次考CSP初赛一样。回想起来22和23年我当时还是蒟蒻,被初赛打爆,不由得感慨万千。(虽然我现在也被初赛打爆)。想到我已经学了这么多年OI却还是个蒟蒻,我的嘴角不禁缓缓上扬,并且发出了笑一样的哭声。

当年我还觉得外校很神秘,但是现在我已经在外高上了3年课了。

众所周知在湖北这么弱的省初赛瞎考都能过。

下午考初赛,中午 @Eason_cyx 教我打 territoral.io

考试以前想起来没带身份证,让佳佳来送了一下。

考试后我正常的做题,感觉还挺简单。这个试卷上的代码写的不像人类,唐完了。

考完后很多人开始敬礼,并且洗嗨洗嗨的叫,让CSP考场成为了非法集会现场。

感觉小学生看起来好多啊,还是说他们都是初一的。

Day 出初赛分

83,被外高其他人打爆了。膜拜外高初赛巨佬%%%。

复赛部分

Day 2025.10.19

今晚本可以不去上晚辅,但是我还是去了,导致参加了生物考试。

Day 2025.10.20-2025.10.26

停课第一周。

这一周前半段我们在机房普及了钢四,可是太难入手了。后半段我们在机房玩MC。我们开了MC服务器,取名为:樱联邦。这是由于我们的基地在樱花树林里。我们服务器实行公有制和按需分配,而且我们坚持【数据删除】的领导,所以我把服务器简介设置为了“【数据删除】樱联邦”。(由于我发现好像碰到了屏蔽词,所以把涉政内容【数据删除】了)

每天模拟赛挂分,做题单被抢首A。尤其是血战库尔斯克那题,我真的忘不了,某个人看了题解后没有完全理解就直接贺了,但是那题我想了1天多才做出来。

周六那天初一和小学的来参加进校队考试了,我这里就复制当时写的一段东西:


我发现我现在比初一还弱。
今天外高有招信息队的考试,很多初一和小学生来考试(我初一时参加了)。我们高一的过去发帮忙试卷。
然后我不小心跑到六楼阶梯教室去了,找不到四楼报告厅在哪里,碰巧遇到Splay_trees带一些走错考场的考生前往考场,才问到四楼报告厅在哪。我这才回忆起来我当年也是在四楼报告厅考的。
发试卷的时候我们一起看了试卷,我感觉有一道题目很困难,结果想出来以后想起来当年我把这题秒了。
最后一道程序题我还想用筛法过,结果直接枚举回文串就可以。
有个路径计数的问题,要求写过程,我除了全部枚举想不到任何过程写法,Splay_trees直接秒了,膜拜巨佬%%%。
在收卷的时候我看见一个人试卷只写了几道填空题,其他全部空着,不小心叫出了声来,幸好被Splay阻止了。看来我素质越来越低了。还有一个人直接破防了,我让他交草稿纸时当着我的面把草稿纸撕了。
后面我们把答题卡运回来一起观摩了。感觉这些考生好会画画啊。我没拍照,就搬gala拍的照片了。
回想起来初一我参加考试时素质又高,又有OI水平,而现在我太菜了,比当时弱多了,还没素质。
期待下周我们高一给他们改卷。

这是我发QQ空间的,懒得再写一次了。

图片就不传上来了。

Day 2025.10.28-2025.10.31

周一时彻底后悔了当时说的要改卷。

首先我改的最慢,大家都改完了几卷了我还在改第一卷。好在后面速度慢慢提升了。那天松请大家吃了麦当劳。

没看成班上同学表演金秋读书节,我们赶过去时已经结束力。

然后我改的时候遇到了很恶心的试卷,关键是他的代码好像还真是对的,在题目给的数据范围内(n只有5)真的就能过。我服了,还给了他分。记住他的名字了,如果他进来了我一定要去找他。

我们模拟赛打的依托答辩,松进来看见我们玩MC说“别玩这个破游戏了”,我们以为是模拟赛太差了导致松比较生气。后面晚上时松又说“还在玩这个弱智游戏”,我们这才知道原来松认为MC是弱智游戏。

后面有一次晚上玩MC,玩到一半被叫下去换座位。gyx忘记退出游戏,后面松进来看到了游戏界面,说“还在玩这个游戏,我看看这是什么游戏,Minecraft,矿产争霸”这种话(忘记原话了,不过意思差不多,而且矿产争霸这个名字绝对没记错),这事我们可以笑到毕业。

10.31是我妹妹生日。当天我没有进行有效的复习,一直在颓废,而且在机房大佬的指导下第一次玩了卡牌冒险者。

Day 1

上午没有做跟OI有关的任何事情。

下午,直接面对CSP-S吧。

进机房以前好墨迹啊,比往年人还多了吗?为什么排的这么慢?

进去之后差点没找到座位。每两个机位之间甚至没有空一格座位,绷不住了。

14:30

比赛开始,我解压程序。

14:50左右

读完所有题面,开始思考T1。

15:10

过掉了T1所有大样例和自己的对拍。

16:28

发现代码放错文件夹了

16:32

这个T2第四个大样例怎么出的,m这么小

16:34

怎么后两个大样例的范围都有问题阿

17:10

被自己笑希了,”手写“了归并排序

17:20

思考T3T4

17:45

开始写T3

18:07

T3偶遇神秘bug

18:25

bug解决了,可是已经没机会了。

赛后才知道那个bug的原因是vector的size函数返回了unsigned类型。

代码:

club

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100005
int t,n,a[N][3],cnt[3];
struct node{
    int c,f,s,t,d;
    //first,second,third,derta
}A[N];
bool cmp(node a,node b){
    return a.d>b.d;
}
int swap_f;
void swap(int&a,int&b){
    swap_f=a,a=b,b=swap_f;
}
int main(){
    freopen("club.in","r",stdin);
    freopen("club.out","w",stdout);
    scanf("%d",&t);
    while(t--){
        long long ans=0;
        cnt[0]=cnt[1]=cnt[2]=0;
        scanf("%d",&n);
        for(int c=0;c<n;c++){
            scanf("%d%d%d",a[c],a[c]+1,a[c]+2);
            A[c].c=c,A[c].f=0,A[c].s=1,A[c].t=2;
            if(a[c][A[c].f]<a[c][A[c].s]) swap(A[c].f,A[c].s);
            if(a[c][A[c].f]<a[c][A[c].t]) swap(A[c].f,A[c].t);
            if(a[c][A[c].s]<a[c][A[c].t]) swap(A[c].s,A[c].t);
            A[c].d=a[c][A[c].f]-a[c][A[c].s];
        }
        sort(A,A+n,cmp);
        for(int c=0;c<n;c++){
            if(cnt[A[c].f]<(n>>1)) cnt[A[c].f]++,ans+=a[A[c].c][A[c].f];
            else cnt[A[c].s]++,ans+=a[A[c].c][A[c].s];
        }
        printf("%lld\n",ans);
    }
    return 0;
}
/*
15:10 干掉T1



*/

road

#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
#define K 11
#define N 10004
#define M 1000006
struct dsu{
    int f[N+K],s[N+K];
    void init(){
        for(int c=1;c<N+K;c++) f[c]=c,s[c]=1;
    }
    int find(int x){
        return x==f[x]?x:(f[x]=find(f[x]));
    }
    void merge(int x,int y){
        if(find(x)==find(y)) return;
        x=find(x),y=find(y);
        if(s[x]<s[y]) s[y]+=s[x],f[x]=y;
        else s[x]+=s[y],f[y]=x;
    }
}d;
vector<int>lis;
struct edge{
    int u,v,w;
}e[M],e1[N],e2[N*K],ec[K][N];
bool cmp(edge a,edge b){
    return a.w<b.w;
}
int n,m,k,C[K],atk;
long long ans,sum;
int l1,l2;
edge themin(edge*e,edge*e2,int m1,int m2){
    if(l2==m2){l1++;return e[l1-1];} 
    if(l1==m1){l2++;return e2[l2-1];} 
    if(e[l1].w<e2[l2].w){l1++;return e[l1-1];}
    else{l2++;return e2[l2-1];}
}
void Merge(edge*a,edge*b,edge*c,int m1,int m2){
    l1=l2=0;
    for(int i=0;i<m1+m2;i++) c[i]=themin(a,b,m1,m2);
}

void init(){
    l1=l2=0;
    d.init();
    if(atk==10){
        Merge(ec[lis[0]],ec[lis[1]],e,n,n);
        Merge(ec[lis[2]],ec[lis[3]],e+(n<<1),n,n);
        Merge(e,e+(n<<1),e+(n<<2),n<<1,n<<1);
        Merge(ec[lis[4]],ec[lis[5]],e,n,n);
        Merge(ec[lis[6]],ec[lis[7]],e+(n<<1),n,n);
        Merge(e,e+(n<<1),e+(n<<3),n<<1,n<<1);
        Merge(ec[lis[8]],ec[lis[9]],e,n,n);
        Merge(e+(n<<3),e,e+(n*12),n<<2,n<<1);
        Merge(e+(n<<2),e+(n*12),e2,n<<2,n*6);
    }
    else if(atk==9){
        Merge(ec[lis[0]],ec[lis[1]],e,n,n);
        Merge(ec[lis[2]],ec[lis[3]],e+(n<<1),n,n);
        Merge(e,e+(n<<1),e+(n<<2),n<<1,n<<1);
        Merge(ec[lis[4]],ec[lis[5]],e,n,n);
        Merge(ec[lis[6]],ec[lis[7]],e+(n<<1),n,n);
        Merge(e,e+(n<<1),e+(n<<3),n<<1,n<<1);
        Merge(e+(n<<3),ec[lis[8]],e+(n*12),n<<2,n);
        Merge(e+(n<<2),e+(n*12),e2,n<<2,n*5);
    }
    else if(atk==8){
        Merge(ec[lis[0]],ec[lis[1]],e,n,n);
        Merge(ec[lis[2]],ec[lis[3]],e+(n<<1),n,n);
        Merge(e,e+(n<<1),e+(n<<2),n<<1,n<<1);
        Merge(ec[lis[4]],ec[lis[5]],e,n,n);
        Merge(ec[lis[6]],ec[lis[7]],e+(n<<1),n,n);
        Merge(e,e+(n<<1),e+(n<<3),n<<1,n<<1);
        Merge(e+(n<<3),e+(n<<2),e2,n<<2,n<<2);
    }
    else if(atk==7){
        Merge(ec[lis[0]],ec[lis[1]],e,n,n);
        Merge(ec[lis[2]],ec[lis[3]],e+(n<<1),n,n);
        Merge(e,e+(n<<1),e+(n<<2),n<<1,n<<1);
        Merge(ec[lis[4]],ec[lis[5]],e,n,n);
        Merge(e+(n<<2),e,e+(n*6),(n<<2),n<<1);
        Merge(e+(n*6),ec[lis[6]],e2,n*6,n);
    }
    else if(atk==6){
        Merge(ec[lis[0]],ec[lis[1]],e,n,n);
        Merge(ec[lis[2]],ec[lis[3]],e+(n<<1),n,n);
        Merge(e,e+(n<<1),e+(n<<2),n<<1,n<<1);
        Merge(ec[lis[4]],ec[lis[5]],e,n,n);
        Merge(e+(n<<2),e,e2,(n<<2),n<<1);
    }
    else if(atk==5){
        Merge(ec[lis[0]],ec[lis[1]],e,n,n);
        Merge(ec[lis[2]],ec[lis[3]],e+(n<<1),n,n);
        Merge(e,e+(n<<1),e+(n<<2),n<<1,n<<1);
        Merge(e+(n<<2),ec[lis[4]],e2,(n<<2),n);
    }
    else if(atk==4){
        Merge(ec[lis[0]],ec[lis[1]],e,n,n);
        Merge(ec[lis[2]],ec[lis[3]],e+(n<<1),n,n);
        Merge(e,e+(n<<1),e2,n<<1,n<<1);
    }
    else if(atk==3){
        Merge(ec[lis[0]],ec[lis[1]],e,n,n);
        Merge(e,ec[lis[2]],e2,n<<1,n);
    }
    else if(atk==2) Merge(ec[lis[0]],ec[lis[1]],e2,n,n);
    else for(int c=0;c<n;c++) e2[c]=ec[lis[0]][c];
    // if(l2!=atk*n) puts("No2");
    l1=l2=0;
}
long long solve(int m1,int m2){
    long long ta=sum;
    while(d.s[d.find(1)]!=n+atk){
        edge temp=themin(e1,e2,m1,m2);
        if(d.find(temp.u)==d.find(temp.v)) continue;
        d.merge(temp.u,temp.v);
        ta+=temp.w;
    }
    return ta;
}
void dfs(int x){
    if(x==k){
        if(atk==0) return;
        init();
        ans=min(ans,solve(n-1,atk*n));
    }
    else{
        dfs(x+1);
        sum+=C[x],atk++;
        lis.push_back(x);
        dfs(x+1);
        lis.pop_back();
        sum-=C[x],atk--;
    }
} 
int main(){
    freopen("road.in","r",stdin);
    freopen("road.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(int c=0;c<m;c++) scanf("%d%d%d",&e[c].u,&e[c].v,&e[c].w);
    sort(e,e+m,cmp);
    d.init();
    for(int c=0;c<m;c++){
        if(d.find(e[c].u)==d.find(e[c].v)) continue;
        d.merge(e[c].u,e[c].v);
        ans+=e[c].w;
        e1[l1++]=e[c];
    }
    // if(d.s[d.find(1)]!=n) return 0;
    for(int c=0;c<k;c++){
        scanf("%d",C+c);
        for(int i=1,x;i<=n;i++) scanf("%d",&x),ec[c][i-1]=edge{c+n+1,i,x};
        sort(ec[c],ec[c]+n,cmp);
    }
    // if(l1!=n) puts("No1");
    dfs(0);
    printf("%lld",ans);
    return 0;
}
/*
16:28 发现代码放错文件夹了
16:32 这个T2第四个大样例怎么出的,m这么小
16:34 怎么后两个大样例的范围都有问题阿
17:10 被自己笑希了,”手写“了归并排序
49242201269
*/

replace

#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
#define L 5000006
#define N 200005
vector<char>s[N][2];
char t[2][L];
int n,q,cnt=1;
struct node{
    int fail,son[26],num;
    node(){memset(this,0,sizeof(node));}
}tree[L];
char in;
int qu[L],l,r;
void build(){
    tree[1].fail=1;
    for(int c=0;c<26;c++){
        if(!tree[1].son[c]) tree[1].son[c]=1;
        else tree[tree[1].son[c]].fail=1,qu[r++]=tree[1].son[c];
    }
    while(l<r){
        for(int c=0;c<26;c++){
            if(tree[qu[l]].son[c]) tree[tree[qu[l]].son[c]].fail=tree[tree[qu[l]].fail].son[c],qu[r++]=tree[qu[l]].son[c];
            else tree[qu[l]].son[c]=tree[tree[qu[l]].fail].son[c];
        }
        l++;
    }
}
int try_(int i,int x){
    // printf("out:%d %d %d\n",i,x,s[x][0].size());
    for(int c=0;c+s[x][0].size()<=i;c++){
        // if(c>i-s[x][0].size()) break;
        // printf("test:%d %d\n",c,i-s[x][0].size());
        if(t[0][c]!=t[1][c]) return 0;
        }
    for(int c=i-s[x][0].size()+1;c<=i;c++) if(s[x][1][c-i+s[x][0].size()-1]!=t[1][c]) return 0;
    for(int c=i+1;t[0][c]!='\0';c++) if(t[0][c]!=t[1][c]) return 0;
    return 1;
}
int main(){
    freopen("replace.in","r",stdin);
    freopen("replace.out","w",stdout);
    scanf("%d%d",&n,&q);
    for(int c=1;c<=n;c++){
        do in=getchar();
        while(in<'a'||in>'z');
        do s[c][0].push_back(in),in=getchar();
        while(in>='a'&&in<='z');
        do in=getchar();
        while(in<'a'||in>'z');
        do s[c][1].push_back(in),in=getchar();
        while(in>='a'&&in<='z');
        int now=1,len=s[c][0].size();
        for(int i=0;i<len;i++){
            if(tree[now].son[s[c][0][i]-'a']==0) tree[now].son[s[c][0][i]-'a']=++cnt;
            now=tree[now].son[s[c][0][i]-'a'];
        }
        tree[now].num=c;
    }
    build();
    for(int c=0;c<q;c++){
        int now=1,ans=0;
        scanf("%s%s",t[0],t[1]);
        if(strlen(t[0])!=strlen(t[1])){puts("0");continue;}
        for(int i=0;t[0][i]!='\0';i++){
            now=tree[now].son[t[0][i]-'a'];
            int temp=now;
            while(temp!=1){
                // printf("temp%d\n",temp);
                if(tree[temp].num) ans+=try_(i,tree[now].num);
                temp=tree[temp].fail;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
/*
1 1
a b
a b

1
*/

预计:100+[90,100]+0+0=[190,200]

评价:我真的比前年考得烂了,我是世界上最sb的人。

Day 2025.11.5

我真是世界上最sb的人了,我T2挂到了80,于是只有180。

通过经典申诉通道查到分数。

我是傻逼

Day 2025.11.6

正式出分了,没有变化。

在luogu上交了代码,然后发现,我T2赛时代码在luogu上能过。

CCF评测机真的快了吗,感觉和luogu的差不多啊,我在luogu上最大点只跑了1.36s。很多同学也遇到了类似问题。

被单调队列了,离AFO又近一步。

2025.11.6 upd:初审没过,滥用标题行强调了无意义内容。