CSP-J/S 2025游记
HuangBarry · · 生活·游记
坐标 SC。
下面是本文提到的人名简写与洛谷 UID 对应表:
| 文中简写 | 洛谷 UID |
|---|---|
| CS | 823785 |
| 常教练 | 402881 |
| 陈教练 | 436553 |
| HJM | 1163827 |
| HYX | 747725 |
| HZT | 965313 |
| KZY | 823921 |
| LJX | 752045 |
| LYJ | 913288 |
| WZH | 1080649 |
| XJH | 1163325 |
| 杨教练 | 464866 |
| ZZQ | 655195 |
初赛Day0(19th September):
重学排列组合,又做了一套模拟题,把老师发的知识点大全过了一遍后,睡。
初赛Day1(20th September):
七点半:
起床。
八点:
出门,依旧早饭麦当劳(去年初赛那天早上也是麦当劳)。
八点半:
路过考点门口,停车去了,看到 HJM 站在校门口,QQ 群里 HJM 问有人到没,WZH 说刚醒。
停好车后往校门口走,路上同时遇到了核桃编程和有道小图灵的发传单的老婆婆,她们两因为我扫哪个机构的码还争吵起来了。
和 HJM 碰面,在门口瞎转悠,等三个教练来。
教练来了又给每人发了一张准考证,然后我去买了瓶东方树叶就进学校了。
九点:
教学楼楼下排队,和 CS 等人交流,我说肯定要考哈夫曼编码。
过了一会就要进考场了,我和 CS、WZH 和一个我们学校但是我不认识的一个人一个考场。我和 CS 一起在教室门口准备安检,看到教室内的大屏上写的是:
CSP-S XXX 考试
试卷共 4 张 14 页
XXX
我和 CS 就知道了 S 组的题量,但没过多久就改了,
LJX 进了我们考场结果转了一圈发现走错了,快开考了 WZH 才进考场。
九点半(\textcolor{red}{J组初赛开考} ):
第 1 题,注意到是无符号。
第 4 题,真考了哈夫曼但是这题不会。
第 9 题,怀疑了自己的语法能力,思考 string 类型能直接加 char 吗,后面第一个完善程序看到了这个用法,回来把这题补上了。
第 14 题,错了,基础知识不牢。
第 15 题,简单但是错了,因为 A、C 两个选项可以看成一个是从队头开始遍历,一个是从队尾开始遍历,所以不知道哪个是对的。
阅读程序略。
第一个完善第 5 题,没看到 for 没有 i++,以为有,就选了个 D.// 不执行任何操作。
第二个完善没想到是一道交互,到现在我都没懂它是怎么实现的,但是靠联系上下文把这 5 道题做满了。
十一点半:
出考场和 CS、WZH 瞎聊,一起慢慢下楼,走到一楼了 CS 说他包忘拿了然后赶回去拿,然后我和 WZH 就先走了。
出学校遇到了高手 LJX,跟我们说没有橡皮涂卡涂错了 5 个,然后 KZY 没看到第一题是 无符号整形,然后选了 C.$2\times 10^9$(代码段怎么不支持打
在学校门口一堆人聊了一会儿,我就和 LYJ、WZH、HJM 吃饭去了。
我们到了一家猪肘饭门口,坐下准备凑合吃了,然后杨教练发消息问我们在哪,考虑去他们那边,然后我们就赶紧跑去教练那吃砂锅,此处感谢杨教练请吃饭。
吃的时候我一直在关心答案,教练还说我一直施压力,还说了我一顿。
中午我在我爸车上午休,起来后买了杯古茗就进学校了。
十四点:
教室里遇到 HZT,他拉着我去拜文翁,去磕了三个头就坐在教室里等开考了。
十四点半(\textcolor{red}{S组初赛开考} ):
开考,教室里一大半人没来。
过程略。// 懒得写了
大致是选择一眼没瞪出答案的就跳,后面大题做一大道就回来看一眼。
第二个完善还是交互,我连题面都没看懂,纯靠代码片段联系上下文给做对了五道还是四道。
十六点半:
出考场,依旧和人瞎聊,一出学校,想起手机落考场了,赶紧跑回去拿,然后慢慢走出来的时候偶遇 ZZQ,和他边聊边走出来。
没想到洛谷这么快就出答案了,赶紧对,对完人傻了,83 分,但是细想这次题确实简单,然后和其他人聊了一会拍了个合照就跑路了。
回去还剪了个头,丑死了。
二十点半:
怎么还要打 abc。
0 罚时写了四题,rk1617,涨了 23 分。
25th September:
上完晚自习回家知道出成绩了,没啥说的,在学校信竞 qq 群里说了几句话就被禁言了。
最后 J76,S83。
3rd October:
去世界线漫展了,可惜没 1 号去,有柜子学院的 cos 看,前两天去集训去了。
还在绘画区画了个学校校徽(图片损坏了)。
18th October:
停课集训的分班考试,但是因为我才初二,这个考试还决定我是否停课。
结果是排名正中间,和 ZZQ 同分,原本常教练给我定的目标就是超越 ZZQ。
也是顺利停上课了。
集训期间(19th October到31st October):
去高中部集训了,伙食比初中部好,每天还有 1 节体育课,第一周做专题,第二周打模拟赛,还逃过了一场数学期中考试。
复赛Day0(31st October):
这天的模拟赛是信心赛,但还是挂分了,晚上扫共享电瓶回家,WZH 非要坐,给他送到我家小区门口他又不乐意了。
晚上背了一堆板子,然后就睡了。
复赛Day1(1st November):
七点:
起床收拾东西,出发。
早饭不知道吃啥依旧麦当劳。
飞速到考场门口,依旧和他们瞎聊。
八点:
进学校,等开考。
八点半(\textcolor{red}{J组复赛开考} ):
前两题直接秒了,然后看 T3,一眼 dp,然后就没管看 T4 了。
T4 知道是 dp,但是不会写,于是写了个暴力和组合数学就跑了。
T3 写了半天只能说写了一坨,dp 也写的是部分分,赛场也没想到贪心,调也调了特别久。
十二点:
出考场,猜到学校里会有 AK 的,XJH 就估分 400,CS、HYX 380,感觉就我一个(100+100+60+60=)320。
出考场依旧瞎聊,写游记的时候啥都想不起来了,中午和 CS 他们一起吃饭,没想到又吃一顿麦当劳,让他们帮我抽卡,明日方舟半周年刚更新,40 抽出了银灰。
快吃完了还遇到教练。
依旧在我爸车上午休。
十四点:
到校门口,随便说了几句就进去了。
十四点半(\textcolor{red}{S组复赛开考} ):
开考。
考的一坨不想写。
大概是,T1 写了个 dp,T2 写了个跑
T1 第一眼就是反悔贪心或 dp,但是不会写反悔贪心。
T3 其实赛时想到了 Hash 可以拿大部分分但是写完双 Hash 后调了 1h 无果,于是写了个暴力就走了。
T1、T3 小聪明写了几个特判略减复杂度然后 WA 了。
十八点半:
刚下楼发现手机又忘拿了赶紧跑回去拿。
出考场和他们聊,发现大家估分差不多,心里舒坦了点,然后去聚餐了。
到了初中部后面一个商业体,全部考 S 的和教练(除杨教练)在那吃饭。
跟教练说 8 道题的 freopen 一个没测过,教练也无语了,但最后也没有因 freopen 挂分。
吃完就回去了。
八百年后的某天:
出成绩了,J(100+100+75+64=)339,S(55+40+5+0=)100。
屎。
今年考的屎,游记也写的水,就这样吧,明年再战。
赛时代码:
J:
number:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
string s;
void solve(){
cin>>s;
string ans="";
for(char c:s)
if('0'<=c&&c<='9')
ans+=c;
sort(ans.begin(),ans.end(),greater<char>());
while(ans.front()==0)
ans.erase(ans.begin());
if(ans.empty())
cout<<0<<endl;
else
cout<<ans<<endl;
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
int T=1;
// cin>>T;
while(T--)
solve();
return 0;
}
seat:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int n,m,a[111];
void solve(){
cin>>n>>m;
for(int i=1;i<=n*m;i++)
cin>>a[i];
int R=a[1];
sort(a+1,a+1+n*m,greater<int>());
int pos=1;
for(int i=1;i<=m;i++){
if(i&1){
for(int j=1;j<=n;j++,pos++){
if(a[pos]==R){
cout<<i<<" "<<j<<endl;
return;
}
}
}else{
for(int j=n;j>=1;j--,pos++){
if(a[pos]==R){
cout<<i<<" "<<j<<endl;
return;
}
}
}
}
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
freopen("seat.in","r",stdin);
freopen("seat.out","w",stdout);
int T=1;
// cin>>T;
while(T--)
solve();
return 0;
}
xor:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=5e5+55;
int n,k,a[N],dp[N];
vector<int>cnt;
void solve(){
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
int last=1;
cnt.push_back(0);
for(int i=1;i<=n;i++){
dp[i]=dp[i-1];
if(find(cnt.begin(),cnt.end(),k^a[i])!=cnt.end()){
dp[i]++;
last=i+1;
}
cnt.clear();
cnt.push_back(0);
if(dp[i]==dp[i-1]){
int sum=a[i];
cnt.push_back(a[i]);
for(int j=i-1;j>=last;j--){
sum^=a[j];
cnt.push_back(sum);
}
}
}
cout<<dp[n]<<endl;
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
freopen("xor.in","r",stdin);
freopen("xor.out","w",stdout);
int T=1;
// cin>>T;
while(T--)
solve();
return 0;
}
polygon:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int mod=998244353;
int n,a[5555];
long long fact[5555],invfact[5555];
long long ans=0;
void dfs(int pos,int sum,int maxx,int cnt,int last){
if(cnt>=3&&sum>2*maxx&&last!=cnt){
ans++,ans%=mod;
last=cnt;
}
if(pos>n)
return;
dfs(pos+1,sum,maxx,cnt,last);
dfs(pos+1,sum+a[pos],max(maxx,a[pos]),cnt+1,last);
return;
}
long long qpow(long long base,long long power=mod-2,int mod=mod){
long long res=1;
while(power){
if(power&1)
res*=base,res%=mod;
base*=base,base%=mod;
power>>=1;
}
return res;
}
void init(){
fact[0]=1;
for(int i=1;i<=5000;i++)
fact[i]=fact[i-1]*i%mod;
invfact[5000]=qpow(fact[5000]);
for(int i=4999;i>=0;i--)
invfact[i]=invfact[i+1]*(i+1)%mod;
return;
}
long long C(int m,int n){
if(n==0||n>m)
return 0;
return fact[m]*invfact[n]%mod*invfact[m-n]%mod;
}
void solve(){
cin>>n;
int maxx=-1;
for(int i=1;i<=n;i++)
cin>>a[i],maxx=max(a[i],maxx);
if(maxx!=1){
dfs(1,0,0,0,0);
cout<<ans<<endl;
}else{
init();
long long ans=0;
for(int i=3;i<=n;i++)
ans+=C(n,i),ans%=mod;
cout<<ans<<endl;
}
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
freopen("polygon.in","r",stdin);
freopen("polygon.out","w",stdout);
int T=1;
// cin>>T;
while(T--)
solve();
return 0;
}
S:
club:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=1e5+15;
struct node{
int a,b,c;
}A[N];
int n;
void solve(){
cin>>n;
int suma=0,sumb=0,sumc=0;
for(int i=1;i<=n;i++)
cin>>A[i].a>>A[i].b>>A[i].c,suma+=A[i].a,sumb+=A[i].b,sumc+=A[i].c;
if(sumb==0&&sumc==0){
cout<<suma<<endl;
return;
}
if(sumc==0){
bool now=0;
vector<vector<int>>dp(2,vector<int>(n/2+1,0));
for(int i=1;i<=n;i++){
for(int j=0;j<=min(i,n/2);j++){
int k=i-j;
dp[now][j]=dp[!now][j];
if(j>0)
dp[now][j]=max(dp[now][j],dp[!now][j-1]+A[i].a);
if(k>0)
dp[now][j]=max(dp[now][j],dp[!now][j]+A[i].b);
}
now=!now;
}
int ans=-1;
cout<<dp[!now][n/2]<<endl;
return;
}
bool now=0;
vector<vector<vector<int>>>dp(2,vector<vector<int>>(n/2+1,vector<int>(n/2+1,0)));
for(int i=1;i<=n;i++){
for(int j=0;j<=min(i,n/2);j++)
for(int k=0;k<=min(i,n/2);k++){
int l=i-j-k;
if(l>n/2)
continue;
dp[now][j][k]=dp[!now][j][k];
if(j>0)
dp[now][j][k]=max(dp[now][j][k],dp[!now][j-1][k]+A[i].a);
if(k>0)
dp[now][j][k]=max(dp[now][j][k],dp[!now][j][k-1]+A[i].b);
if(l>0)
dp[now][j][k]=max(dp[now][j][k],dp[!now][j][k]+A[i].c);
}
now=!now;
}
int ans=-1;
for(int j=0;j<=n/2;j++)
for(int k=0;k<=n/2;k++)
ans=max(ans,dp[!now][j][k]);
cout<<ans<<endl;
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
freopen("club.in","r",stdin);
freopen("club.out","w",stdout);
int T=1;
cin>>T;
while(T--)
solve();
return 0;
}
road:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=1e4+14,M=2e6+26;
int dad[N];
int Find(int x){
if(dad[x]!=x)
dad[x]=Find(dad[x]);
return dad[x];
}
void Union(int x,int y){
int fx=Find(x),fy=Find(y);
dad[fy]=fx;
return;
}
struct edge{
int u,v,w;
}e[M],e_[M];
int n,m,k;
int c[11],a[11][N];
long long ans=1e18;
void solve(){
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
e[i]=edge{u,v,w};
}
for(int i=1;i<=k;i++){
cin>>c[i];
for(int j=1;j<=n;j++)
cin>>a[i][j];
}
for(int t=0;t<(1<<k);t++){
for(int i=1;i<=m;i++)
e_[i]=e[i];
long long sum=0;
int cnt=0,pos=m;
for(int i=1;i<=k;i++)
if((t>>(i-1))&1){
cnt++;
sum+=c[i];
for(int j=1;j<=n;j++)
e_[++pos]=edge{n+cnt,j,a[i][j]};
}
if(sum>=ans)
continue;
sort(e_+1,e_+1+pos,[&](const edge&X,const edge&Y)->bool{
return X.w<Y.w;
});
for(int i=1;i<=cnt+n;i++)
dad[i]=i;
int cnte=0;
for(int i=1;i<=pos;i++){
if(sum>=ans)
break;
if(cnte==n+cnt-1)
break;
edge E=e_[i];
if(Find(E.u)!=Find(E.v)){
sum+=E.w;
cnte++;
Union(E.u,E.v);
}
}
ans=min(ans,sum);
}
cout<<ans<<endl;
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
int T=1;
// cin>>T;
while(T--)
solve();
return 0;
}
replace:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=2e5+25;
int n,q;
string t1[N],t2[N];
void solve(){
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>t1[i]>>t2[i];
while(q--){
string s1,s2;
cin>>s1>>s2;
int len=s1.size();
if(len!=s2.size()){
cout<<0<<endl;
continue;
}
int ___=int(s1[0]!=s2[0]);
for(int i=1;i<len;i++)
if(s1[i]!=s2[i]&&s1[i-1]==s2[i-1])
___++;
if(___!=1){
cout<<0<<endl;
continue;
}
int cnt=0;
for(int i=1;i<=n;i++){
int L=t1[i].size();
int _=0;
for(int j=0;j<len-L+1;j++)
if(t1[i]==s1.substr(j,L)&&t2[i]==s2.substr(j,L))
_++;
cnt+=int(_==1);
}
cout<<cnt<<endl;
}
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
freopen("replace.in","r",stdin);
freopen("replace.out","w",stdout);
int T=1;
// cin>>T;
while(T--)
solve();
return 0;
}
employ:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=1e5+15;
struct node{
int a,b,c;
}A[N];
int n;
void solve(){
cout<<0<<endl;
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
freopen("employ.in","r",stdin);
freopen("employ.out","w",stdout);
int T=1;
cin>>T;
while(T--)
solve();
return 0;
}