CSP-S 2025 游寄
HakureiReimu_cjrljpx · · 生活·游记
初赛部分
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又近一步。