CSP-S 2026 游记
day -3
上午依旧文化课,下午一场模拟赛
T1橙题快速签到
T2绿题刚开始不会,去打T3绿题,发现是个BFS秒了
回去想T2,最后1h想到正解,是个类似扫描线的玩意,快速一写,样例错了,半天没调出来,遗憾离场
赛后发现我T2有一个0写成1了,不然就AC了,可惜了
day 0
中午12:30吃完饭就准备上大巴车了
成功获得qy吧唧
Air在车上就开始玩电脑了,sc又开始看他的小说了,后面xhz开始抽卡了,甚至还有5人五排王者(难道只有我没事干吗?)
经过慎重考虑,我决定睡觉(失败了)
过了一会儿Air又开始玩音游了,一看手速直接吓哭了
到了酒店,直接耍起
下午和lhh,xhz,sc,wzj,lmz一起买了个蜜雪冰城,继续耍起
晚上准备出去吃饭,结果到外边转了一圈发现没有啥吃的,于是做出了重要决定(bushi):回去点外卖
坐在一楼等外卖,和Air,sc,lhh,wzj,lmz玩了会儿UNO(Air:动动小手点点举报),又和sc,lmz玩了会儿飞行棋(怎么我好几次都是快赢了,结果连摇三次6回家了,太菜了)
外卖送隔壁酒店了,太可恶了
晚上8:00,dyw过去收手机,于是开始看电视
发现《伟大的长征》,《西北往事》和《我们的队伍向太阳》,直接严肃观看(没想到一集1h)
不看时间,成功到11:50,直接严肃睡觉
day 1
上午7:05起床下楼,成功逮捕dyw和qy
去吃早饭,一碗炸酱面成功辣死自己
等待领手机
8:00胜利获得手机,依旧耍起
11:30点外卖并吃饭,12:30退房并进入大巴车
所有轻步兵进入车辆(kards混入)
继续耍起
到达考点,提前进去合照去了(谨防dyw偷拍)
13:30进入考场,先坐牢了40min(可能)
发现电脑甚至没有Dev-C++
打开压缩包(神秘嵌套压缩包和猎奇密码)
开考了我的lemon还没调好(力竭了)
打开T1,发现答案具有单调性,二分答案即可,对于验证,排序a之后双指针就行
主要代码:
inline int read(){int x;cin>>x;return x;}
const int N=500010;
int a[N];
n=read(),m=read();
for(int i=1;i<=n;i++) {
a[i]=read();
}
sort(a+1,a+n+1);
int l=1,r=n,mid,res=0;
inline bool check(int len) {
int sum=0;
for(int i=1;i<len;i++) {
sum+=(i-1)*(a[i]-a[i-1]);
}
for(int i=len;i<=n;i++) {
sum+=(len-1)*(a[i]-a[i-1]);
if(sum<=m) return 1;
sum-=a[i]-a[i-len+1];
}
return 0;
}
while(l<=r) {
mid=(l+r)>>1;
if(check(mid)) {
l=mid+1;
res=mid;
}
else {
r=mid-1;
}
}
cout<<res;
用了大约30min
打开T2,注意到
考虑如何存储输入,注意到有
考虑如何求出答案,发现可以
时间复杂度为
快速一写,欸!一遍过了!(嘻嘻)
主要代码:
inline int read(){int x;cin>>x;return x;}
const int N=510,M=500010,D=30,INF=1000000000000000000;
int w[M],id[M][D],cnt[M],t[M][D],e[N][N];
read();
int n=read();
int m=read();
read();
int q=read();
for(int i=1;i<=m;i++) {
w[i]=read();
}
for(int i=1;i<=n;i++) {
int k=read();
for(int j=1;j<=k;j++) {
int a=read();
cnt[a]++;
id[a][cnt[a]]=i;
t[a][cnt[a]]=read();
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
e[i][j]=INF;
}
}
for(int i=1;i<=m;i++) {
for(int x=1;x<=cnt[i];x++) {
for(int y=1;y<=cnt[i];y++) {
e[id[i][x]][id[i][y]]=min(e[id[i][x]][id[i][y]],t[i][x]+t[i][y]);
}
}
}
for(int i=1;i<=n;i++) {
e[i][i]=0;
}
for(int k=1;k<=n;k++) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
}
}
}
for(int r=1;r<=q;r++) {
int x=read(),y=read();
int ans=INF;
for(int i=1;i<=cnt[x];i++) {
for(int j=1;j<=cnt[y];j++) {
ans=min(ans,w[x]+t[x][i]+e[id[x][i]][id[y][j]]+t[y][j]+w[y]);
}
}
cout<<ans<<"\n";
}
也是用了大约30min
至此过了一小时,而我已经完成了T1和T2,然后开T3,发现这很诡异,于是打了一个
主要代码:
inline int read(){int x;cin>>x;return x;}
const int N=2000010,N1=310,INF=1000000000000000000;
int x[N],e[N1][N1],cnt[N1][N1];
int c=read();
for(int t=read();t>0;t--) {
int n=read(),d=read();
for(int i=1;i<=n;i++) {
x[i]=read();
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
e[i][j]=INF;
cnt[i][j]=0;
}
}
for(int l=1,r=0;l<=n;l++) {
while(r<n&&x[r+1]-x[l]<=d) {
r++;
}
for(int i=l;i<=r;i++) {
e[l][i]=1;
cnt[l][i]=1;
}
}
for(int i=1;i<=n;i++) {
e[i][i]=1;
cnt[i][i]=1;
}
for(int k=1;k<=n;k++) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(e[i][j]>e[i][k]+e[k][j]) {
e[i][j]=e[i][k]+e[k][j];
cnt[i][j]=cnt[i][k]*cnt[k][j];
}
else if(e[i][j]==e[i][k]+e[k][j]) {
cnt[i][j]+=cnt[i][k]*cnt[k][j];
}
}
}
}
int ans=0;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(cnt[i][j]==2) {
ans++;
}
}
}
cout<<ans<<"\n";
}
打开T4,发现太难了,直接跑路
剩下三小时猛想T3,没有一点思路,试图写特殊性质还假了😭
比赛结束了,一共100+100+24+0=224分,应该有一等了
出了考场和其他人集合,四处打听,发现和我一届的10人里,只有我和lhh写出了T2
发现Air T3 AC了并拿到了340(日常被Air吓哭)
听说赛场机器跑的很慢,但是我用lemon T2跑到了最多515ms,不懂
晚上打开luogu,发现:黄青紫黑!那我知道为什么我做不出来T3T4了(太菜了)
复现T1 T2考场代码,直接AC
day 2
听同学说T1可以直接
inline int read(){int x;cin>>x;return x;}
const int N=500010;
int a[N];
int n=read(),m=read();
for(int i=1;i<=n;i++) {
a[i]=read();
}
sort(a+1,a+n+1);
int ans=0;
for(int l=1,r=0,s=0;l<=n;l++) {
while(r<n&&s+(a[r+1]-a[r])*(r-l+1)<=m) {
s+=(a[r+1]-a[r])*(r-l+1);
r++;
}
ans=max(ans,r-l+1);
s-=a[r]-a[l];
}
cout<<ans;
发现T2降绿了,那我知道我为什么能1h切T1 T2了
回学校继续上课
没了