CSP 2023 游记
前言
学 OI 的第二年,也是第二次参加 CSP((
今年是把普及和提高一起报了,被 CCF 狂坑 \(100\) RMB 寄。
这个赛季期望目标(求稳一点)就是普及一等(\(300\)+ pts)加上提高二等,当然提高如果能冲个一等就起飞了。
7.11-7.19
在石门集训学新算法。老师是klii,是今年石门毕业生,高二打 S 组和 NOIP 时拿下了 \(300\) 多 pts 的辉煌战绩,恐怖如斯。
学了一车提高算法,其中 AC 自动机凭借其逆天的抽象程度被机房骂了 several days。
该说不说,石中饭堂比辣鸡 HY 好吃多了,床垫很软好评。天天晚上没事干就和舍友玩狼人杀和谁是卧底(
7.20
石门最后一天模拟赛。
题目如下:
A:给定长为 \(n\) 的序列,每次可以选择相邻两个数合并成他们的和,并插入原位置,求最少的操作次数使得数组回文。\(n \le 10^6\)。
B:给定长为 \(n\) 的序列,再给定质数 \(p\) 和常数 \(k\),求出满足 \(1 \le i<j \le n\) 并且满足 \((a_{i}+a_{j})(a_{i}^2+a_{j}^2)≡k \pmod p\) 的二元组 \((i,j)\) 的个数。\(n \le 3 \times 10^5\),\(2 \le p \le 10^9\),\(0 \le k,a_{i} < p\)。
C:给定 \(n\) 个点 \(m\) 条边的图,图有点权和边权。定义第 \(i\) 条边能被修复当且仅当对于 \((u_{i},v_{i},w_{i})\),\(u_{i}\) 所在连通块的点权和加上 \(v_{i}\) 所在连通块的点权和不小于 \(w_{i}\),且 \(u_{i}\) 和 \(v_{i}\) 在不同连通块,初始时点对间互不连通。需要在修复边数尽量多的情况下使得修复边字典序最小。\(1 \le n \le 10^5\),\(1 \le m \le 2 \times 10^5\),\(1 \le w_{i},a_{i} \le 10^6\)。
D:给定长为 \(n\) 的序列,写一种数据结构支持区间与,区间或,查询区间最小值。\(1 \le n \le 5 \times 10^5\),值域为 \(2^{31}\)。
最后是 \(100+35+52+48=235\),rk \(11\),没有挂分,膜拜 lzh rk\(9\),但是线段树不写懒标记下放到叶子节点学到了,修改 \(O(n \log n)\),询问 \(O(\log n)\),谁让询问太多了呢,好活。B 题没做出来不太舒服,乱搞多了 \(5\) pts 成功上升 \(8\) 个名次,赢麻了((
个人题目评价:A 题好,这么裸的双指针还想 \(20\) min,鉴定为菜狗。B 题好,我连平方差都没看出来,对不起数学老师 smd。C 题好,数据真棒,全机房 \(O(nm)\) 跑过 \(10^5\)。D 题好,似乎是雅礼集训的题,反正不会。
个人难度评价:黄、绿、蓝/紫、紫。
似乎差不多 S 组难度?但是 CCF 似乎不会在 D 题这种位置放裸的数据结构题。
8.15
打你谷 J 组模拟赛,AK 了。
晚上发现对拍 A+B 的时候半秒才拍一组???
8.19
复盘一下 ABC315,这场是真的比以往简单不少。
A.tcdr
题意:给定一个字符串 \(S\),输出 \(S\) 中不为元音字母的字母。\(1 \le |S| \le 100\)。
sol:红题模拟,太难了不复盘。
B.The Middle Day
题意:给定 \(n\) 个数,保证和为奇数,找出中间数在第几个位置。\(1 \le n \le 100\)。
sol:红题模拟,太难了不复盘。
C.Flavors
题意:给定 \(n\) 个二元组,每个二元组形如 \((F,S)\),要求选定 \(2\) 个二元组,若 \(F\) 相等,则贡献为 \(S_{1}+\frac{S_{2}}{2}(S_{1} \ge S_{2})\);反之,贡献为 \(S_{1}+S_{2}\),最大化贡献。\(1 \le n \le 3 \times 10^5\)。
sol:先排个序,以 \(F\) 为第一关键字,记录相等的最大值和不同的最大值分讨一下即可。
D.Magical Cookies
题意:给出 \(H \times W\) 的地图,不断进行以下操作:
-
选定某行,若这行字母数 \(\ge 2\),并且全是相同的,将其标记。
-
选定某列,若这列字母数 \(\ge 2\),并且全是相同的,将其标记。
-
把目前标记删除,若无删除,结束操作,否则重新跳回操作 1。
\(1 \le H,W \le 2000\)。
sol:异验定真,鉴定为乱搞题。想了一下发现没有什么好的数据结构方便维护,那么直接按题意模拟,\(a_{i,j}\) 表示第 \(i\) 行字母 \(j\) 的个数,\(b_{i,j}\) 表示第 \(i\) 列字母 \(j\) 的个数,然后模拟的同时动态维护这个玩意即可。少了一个剪枝没跑过去(
code:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define N 2005
int n,m,i,j,ans,a[N][30],b[N][30],cntl[N],cntr[N],fl[N],fr[N],flagl[N],flagr[N];
char mp[N][N];
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%s",mp[i]+1);
for(i=1;i<=n;i++){
cntl[i]=m;
for(j=1;j<=m;j++) a[i][mp[i][j]-'a'+1]++;
}
for(j=1;j<=m;j++){
cntr[j]=n;
for(i=1;i<=n;i++) b[j][mp[i][j]-'a'+1]++;
}
// printf("%d\n",a[1][1]);
while(1){
int biao=0;
for(i=1;i<=n;i++){
if(fl[i]==1 || cntl[i]<2) continue;
flagl[i]=0;
for(j=1;j<=26;j++){
if(a[i][j] && a[i][j]==cntl[i]){
flagl[i]=1;
break;
}
}
if(flagl[i]==1) biao=1;
}
for(j=1;j<=m;j++){
if(fr[j]==1 || cntr[j]<2) continue;
flagr[j]=0;
for(i=1;i<=26;i++){
if(b[j][i] && b[j][i]==cntr[j]){
flagr[j]=1;
break;
}
}
if(flagr[j]==1) biao=1;
}
if(!biao) break;
for(i=1;i<=n;i++){
if(flagl[i]==1 && fl[i]==0){
fl[i]=1,biao=1;
for(j=1;j<=m;j++){
if(mp[i][j]>0) cntr[j]--,b[j][mp[i][j]-'a'+1]--,mp[i][j]=0;
}
}
}
for(j=1;j<=m;j++){
if(flagr[j]==1 && fr[j]==0){
fr[j]=1,biao=1;
for(i=1;i<=n;i++){
if(mp[i][j]>0) cntl[i]--,a[i][mp[i][j]-'a'+1]--,mp[i][j]=0;
}
}
}
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++) if(mp[i][j]) ans++;
}
printf("%d\n",ans);
return 0;
}
E.Prerequisites
题意:有 \(n\) 本书,读第 \(i\) 本书之前都需要读一些其他的书,求读到书本 \(1\) 需要读的最少数目并输出读书顺序。\(1 \le n \le 2 \times 10^5\)。
sol:一看就是拓扑模板,比 D 还简单。先把拓扑序搞出来,然后 BFS 看 \(1\) 号点能到哪些点,在拓扑序中把不能到的点删了就行。
code:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define N 200005
int n,m,i,j,ans,dis[N],ru[N],pre[N],x,a,k[N],p,Q[N*30],u[N],f[N],y,t;
vector<int>G[N],F[N];
queue<int>q;
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&m);
for(j=1;j<=m;j++) scanf("%d",&x),G[x].push_back(i),F[i].push_back(x),ru[i]++;
}
memset(dis,1,sizeof(dis));
memset(f,1,sizeof(f));
Q[1]=1,f[1]=0;
for(y=t=1;y<=t;y++){
a=Q[y],u[a]=0;
for(int x:F[a]){
if(f[x]>f[a]+1){
f[x]=f[a]+1;
if(!u[x]) u[x]=1,Q[++t]=x;
}
}
}
for(i=1;i<=n;i++){
if(!ru[i]) q.push(i),dis[i]=0;
}
while(!q.empty()){
a=q.front(),q.pop(),k[++p]=a;
for(int y:G[a]){
if(dis[y]>dis[a]+1){
dis[y]=dis[a]+1;
pre[y]=a;
}
ru[y]--;
if(!ru[y]) q.push(y);
}
}
// for(i=1;i<=n;i++) printf("%d\n",f[i]);
for(i=1;i<=n;i++) if(f[k[i]]!=f[0] && k[i]!=1) printf("%d ",k[i]);
return 0;
}
F.Shortcuts
题意:给定 \(n\) 个点在平面上的位置,你需要从 \(1\) 号点走到 \(n\) 号点,两点间距离为欧几里得距离,你可以走的过程中你可以跳过某些点(即不用到达这个点)直接跳到下一个点,记你总共有 \(k\) 个点选择跳过,那么总答案要加上 \(2^{k-1}\),若 \(k=0\) 则不用加。最小化总的欧几里得距离和额外答案之和。\(1 \le n \le 10^4\),值域 \(1 \le x_{i},y_{i} \le 10^4\)。
sol:看到有 \(2^{k-1}\) 这个东西没有要求取模,可以发现 \(k\) 一定不会太大。考虑到值域也比较小,那么欧几里得最大跳跃距离即每次从地图左下角跳回右上角,最大为 \(\sqrt{(10^8+10^8)} \times n\),差不多为 \(10^8\),所以 \(k\) 最多也就 \(30\) 左右。然后可以直接写记搜从 \(1\) 号点开始跳,记忆化数组 \(f_{i,j}\) 表示到第 \(i\) 个点已经有 \(j\) 个点不跳的最小值。复杂度不会算,但是跑过去了(
code:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define N 10005
int n,m,i,j;
long double dis[N],a[N],b[N],ans=1000000000.00,qp[65],f[N][65];
long double solve(int x,int y){
return sqrt((a[x]-a[y])*(a[x]-a[y])+(b[x]-b[y])*(b[x]-b[y]));
}
long double dfs(int k,int cnt){
if(k==n){
if(cnt==0) return 0.0;
return qp[cnt-1];
}
if(f[k][cnt]!=-1.0) return f[k][cnt];
long double Mx=1000000000000000.0;
for(int i=1;i+k<=n;i++){
if(cnt+(i-1)>50) break;
Mx=min(Mx,dfs(i+k,cnt+i-1)+solve(k,k+i));
}
return f[k][cnt]=Mx;
}
int main(){
qp[0]=1.0;for(i=1;i<=60;i++) qp[i]=qp[i-1]*2.0;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%Lf%Lf",&a[i],&b[i]);
for(i=1;i<=n;i++){
for(j=0;j<=60;j++) f[i][j]=-1.0;
}
ans=dfs(1,0);
printf("%.20Lf",ans);
return 0;
}
G.Ai + Bj + Ck = X (1 <= i, j, k <= N)
题意:给定 \(n,a,b,c,x\),求满足 \(1 \le i,j,k \le n\) 且 \(ai+bj+ck=x\) 的三元组 \((i,j,k)\) 的个数。\(1 \le n \le 10^6\),\(1 \le a,b,c \le 10^9\),\(1 \le x \le 3 \times 10^{15}\)。
sol:考虑到我们可以枚举 \(i\),那么我们可以消掉 \(ai\),那变成求 \(bj+ck=x-ai\) 的二元组个数,这个是容易扩欧求出的,再调一下边界即可。但我菜,现在还没调出来,所以暂时没有 code。在一位大佬的帮助下成功调出来了,问题主要是在处理 \(x\) 和 \(y\) 的范围时没分讨好。
code:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
__int128 n,m,i,j,ans,a,b,c,x,l,r;
__int128 gcd(__int128 a,__int128 b){
if(b==0) return a;
return gcd(b,a%b);
}
void exgcd(__int128 a,__int128 b,__int128 c){
if(b==0){
l=c/a,r=0;
return;
}
exgcd(b,a%b,c);
__int128 tmp=l;
l=r,r=tmp-a/b*r;
}
inline __int128 read(){
__int128 x=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void write(__int128 x){
if (x<0) putchar('-'),x=-x;
if (x>9) write(x/10);
putchar(x%10+'0');
}
signed main(){
n=read(),a=read(),b=read(),c=read(),x=read();
for(i=1;i<=n;i++){
__int128 k=x-a*i,d=gcd(b,c);
if(k%d!=0 || k<b+c) continue;
exgcd(b,c,k);
__int128 L=c/d,R=b/d;
if(l>0) {l%=L;if(l==0) l+=L;}
else {__int128 cnt=(-l)/L+1;l+=cnt*L;}
if(l>n) continue;
r=(k-b*l)/c;
if(r<=0) continue;
if(r>n){
if((r-n)%R==0) r=n;
else r=r-((r-n)/R+1)*R;
l=(k-c*r)/b;
if(l>n || r<=0) continue;
}
__int128 p1=0,p2=0;
if(r%R==0) p1=r/R;
else p1=r/R+1;
p2=(n-l)/L+1;
ans+=min(p1,p2);
}
write(ans);
return 0;
}
8.25
在华英。
上午讲初赛+下午打比赛。
下午是 cjh 的比赛,最高分 \(303\),sto lwj orz!!!
8.26
在华英。
下午讲初赛+上午打比赛。
上午是我和 lyt 的比赛,最高分 \(269\),sto lwj orz!!!
8.27
在华英。
上午讲初赛+下午打比赛。
下午打一场水题赛,我也参加了,大概是 \(13:50\) 开打,大概 \(14:15\) 左右感觉 AK 了,过了一会开网提交代码果然 AK 了,喜提 rk\(1\),顺便喜提 C 和 D 首 A。赛后差点以为 D 题贪心假了,结果和 lyt 记搜代码拍了将近一万组也没拍出来。好吧是真 AK 了。
8.28
在华英。
下午继续打成都七中的模拟赛,这场明显比上场难,最终是 \(420\) 分,一共 \(5\) 题,D 题没做出来。E 题也差点没做出来,差点被小初一薄纱。最后是有惊无险 rk\(1\),rk\(2\) 是 \(400\) 分。
8.29
在华英。
上午讲初赛+下午打比赛。
A 正解双指针 \(O(2n)\),但我写了个 \(O(3n)\) 的跳跃数组的做法,结果在 HYoj 老年机上跑不过 \(10^7\),挂到暴力分。B 沙比模拟。C dp 板子。D 神仙 dp,考场上写出了记搜,不过不会把记忆化数组传参喜提暴力分,rk\(3\) 被初一吊打。
8.30
在华英。
上午讲初赛+下午打比赛。
由于昨天被卡了一车玩意,很火大,刚好发了 pdf 的题面,一看全是简单题,经典贪心+经典 trick,大概 \(20\) min AK,结果 B 题 oj 老年机 \(10^6\) 又跑不过单 \(\log\),又吃罚时。无所谓,卡卡常就 rk\(1\)。被连卡两天常,非常火大。
8.31
在华英。
上午讲初赛+下午打比赛。开学考了,悲。佛山不延迟开学非常火大。
9.1
开学典礼看到 lyt 和 lzk 在升旗台唱歌,不愧是数理强鸡班的选手,我是个弱鸡所以进不了作业班。
9.2
白天复习了点算法。
晚上彭老师让打 ABC,于是就 Rated 了,由于以前都没怎么打过,这次是切了 A-E,上了 \(219\) 分,也不知道算不算多()
A.Full Moon
题意:给定区间 \([1,n]\),问有几个数满足是 \(m+kp\) 的形式,其中 \(m\)、\(p\) 为给定值,\(k\) 为正整数。\(1 \le n,m,p \le 2 \times 10^5\)。
sol:值域很小,可以直接模拟。扩展:如果值域大的话可以先确定区间第一个符合的左端点和最后一个符合的右端点,然后植树问题求解即可。可以做到 \(O(1)\)。
B.Overlapping sheets
题意:给定 \(n\) 个矩形,求最终在平面上的矩形面积并。\(1 \le n,x,y \le 100\)。
sol:第一眼看以为是扫描线吓死我了,结果一看范围才 \(100\),那直接暴力标记,最终暴力统计即可。复杂度三次方。
C.Blue Spring
题意:给定 \(n\) 个活动,每个活动有对应的花费 \(a_{i}\),现在你可以选择花 \(P\) 元买 \(D\) 张代金券,每张代金券可以代替一个活动的花费。最小化买代金券和活动花费的总和。\(1 \le n,D \le 2 \times 10^5\),\(1 \le a_{i},P \le 10^9\)。
sol:简单贪心。考虑对 \(a\) 排序,然后每 \(D\) 个为一组,若花费综合大于 \(P\) 则必买代金券,若对于最后不足 \(D\) 个但也大于 \(P\) 也要买。剩下的就花原代价即可。复杂度 \(O(n \log n)\)。
D.General Weighted Max Matching
题意:给出一张无向完全图,要求你选出一条边且同一个点最多出现在一条边上,最大化边权总和。\(1 \le n \le 16\)。
sol:注意到 \(n\) 很小,考虑直接爆搜。但我脑瘫写了枚举边的,加了个小剪枝然后启发性搜索跑过去了,最大点跑了 \(1\)s 多一点。更优化的应该向 lq 一样枚举点,对于每个选择的点 \(O(n)\) 枚举这条边的另一端点。有趣的是,我的代码跑 \(n=16\) 本地显示跑了 \(5\)s,lq 跑了 \(3\)s,但都跑过去了()
code:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define N 20
#define int long long
int n,m,i,j,ans,u[N],mp[N][N],x,c[20],f[N],l[N*N*N],cnt,r[N*N*N];
void dfs(int k,int s,int f){
if(k>n){
ans=max(ans,s);
return;
}
if(c[k]) dfs(k+1,s,f);
else{
if(n%2==1 && f==0) dfs(k+1,s,1);
c[k]=1;
for(int i=1;i<=n;i++){
if(c[i]) continue;
c[i]=1;
dfs(k+1,s+mp[k][i],f);
c[i]=0;
}
c[k]=0;
}
}
signed main(){
scanf("%lld",&n);
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++) scanf("%lld",&x),mp[i][j]=mp[j][i]=x,l[++cnt]=i,r[cnt]=j;
}
dfs(1,0,0);
printf("%lld\n",ans);
return 0;
}
E.Sandwiches
题意:给定长为 \(n\) 的序列 \(a\),求出满足 \(1 \le i < j < k \le n\) 且 \(a_{i}=a_{k}\) 且 \(a_{i} \ne a_{j}\) 的三元组 \((i,j,k)\) 的个数。\(3 \le n \le 3 \times 10^5\),\(1 \le a_{i} \le n\)。
sol:首先 \(O(n^3)\) 的暴力枚举是容易的。但稍微想一下我们就会发现 \(O(n^2)\) 也是容易的,我们可以枚举 \(i\) 和 \(k\),然后统计区间 \([i+1,k-1]\) 与 \(a_{i}\) 不同的个数即可。现在来考虑正解。容易发现,同一个数一定是 x - - x - x - - x
的形式,我们可以发现第一段非 \(x\) 的连续区间对答案的贡献是 \(1 \times 3\),第二段非 \(x\) 的连续区间对答案的贡献是 \(2 \times 2=4\),所以对于 \(a_{i}=a_{k}=x\) 的情况,某段非 \(x\) 对答案的贡献为其两边 \(x\) 个数的乘积。所以我们可以在 \(a_{i}\) 第一次出现的位置处理完 \(a_{i}\) 的所有贡献。复杂度 \(O(n)\)。
code:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define N 300005
#define int long long
int n,m,i,j,ans,a[N],s[N];
int f[N],l[N],r[N],mp[N];
vector<int>G[N],F[N];
signed main(){
scanf("%lld",&n);
for(i=1;i<=n;i++){
scanf("%lld",&a[i]);
if(!f[a[i]]) f[a[i]]=i;
G[a[i]].push_back(i),l[i]=G[a[i]].size()-1;
}
for(i=n;i>=1;i--){
F[a[i]].push_back(i),r[i]=F[a[i]].size()-1;
}
for(i=1;i<=n;i++){
if(f[a[i]]==i){
int lst=0;
for(int y:G[a[i]]){
int L=l[y],R=r[y]+1;
ans+=L*R*(y-lst-1),lst=y;
}
}
}
printf("%lld\n",ans);
return 0;
}
9.8
晚上 Soso 发了开学考成绩,寄了,辣鸡历史考了屑 \(82\) 分。
9.9
在华英。
上午做了份 2020 的 J 组初赛题,喜提 \(90\)pts,看上去很稳,但心里还是很慌两个组别的初赛。
下午又是打了 cjh 的比赛(?
看完一题不会,心想要保龄了,非常自闭。
然后看看 T1,似乎是蒟蒻杯的题?哦不对,原来是可以平方过的,现在加强 \(10^6\) 了,于是暴力卡时先搞了 \(90\)pts,弃了。
再来看看 T2,第一眼博弈论?哦原来 cp 不是自主选择的,那没事了。一看范围 \(10^3\),直接上 dp 随便搞搞,过了。
跑来看看 T3,噢~原来是大构造题啊,先打打 \(O(n!)\) 暴力搞了 \(40\)pts,然后在草稿纸上画了半天,发现关键在于生成树,然后随便加一条边就行了?赶快码了,调完交上去怎么都是 \(96\)pts,不知道哪里寄了,非常自闭。
最后看看 T4,看上去是数据结构,但是感觉彭老师不会把数据结构的题放上来,但想了想会不了一点,于是最低档暴力 \(20\)pts 跑路。
最后没事干又回来看 T1,发现只需关心比 \(a_{i}\) 大的数就行了,于是直接上二分,\(O(n \log n)\) 过了。
最后是 \(100+100+96+20=316\),lyt AK 了非常强大。
结束后马上跑过去找彭老师,问第三题正解是不是生成树,我得到了肯定的答案。于是讨论一番后发现我染色出了问题,应该生成树上先染两种颜色,最后加边再随便找一个点换,三分图真有趣。不过问了一圈好像只有我想到了 T3 正解(?
T3 最关键的我都会了,在实现方面挂了,没做出大构造非常自闭。
晚上打了 ABC,开了 Rated。
最后降智只切了 A-D,C 的阅读理解坑了我半天。E 题想到了找循环周期但是以为周期最多为 \(8\),结果是 \(1-8\) 的 \(\lcm\),算了不管了。
9.16
万众瞩目的初赛来了,初中最后一个赛季到来了。
morning 9:30-11:30 J 组
提前几分钟发了卷子,简单扫了一眼选择题,感觉非常可做?又飞速扫了完善程序,原题?好,优势在我!
飞速开干选择,一些需要花时间算的全部先丢,大概空了 \(5\) 个选择,然后去搞阅读程序。
开 T1,啥啊原来是个海伦公式,还给了两个直角三角形非常友好,很快算完了。
开 T2,啥啊原来是个 dp 啊,但我错误理解为把 \(a\) 串弄成环后 \(b\) 串是否匹配,考场按这个思路写了,考完发现不对,但只错了一个选择题,可以接受。
开 T3,啥啊原来是因子平方和啊,找些特殊情况再算算就 ok。
此时不到 \(45\) 分钟,信心大涨。飞速搞完善程序。
开 T1,是个二分,不过不是我习惯写的那种,但在去的路上和同学奶了二分各种写法,所以做的比较轻松。
开 T2,又是个 dp,还是个原题,我甚至做过。但是秉承“自己会写不代表会看”的原则,也是成功错了两个选项。
最后爬回去写完选择,开始龟速检查。检查过程中救了 \(6\) 分,谢天谢地。
中午吃饭时和同学对答案然后去各大网站估分,算出来是 \(87\) 分,没想过这么高,很高兴。
噢还有 CCF 出错题了,整个世界都改了选项,只有广东佛山初心不改。
afternoon 14:30-16:30 S 组
看卷的时候傻眼了,又考了 Linux,还都是不会的,直接根据英文选,然后错了。
选择题做了半天,好难,根本不会,做完还空了 \(5\) 个空,有点慌。
然后去看阅读程序。
开 T1,啥啊原来是个计算题啊,算一下就完啦,好家伙还有个 unsigned,我以为爆了,然后就错了一个判断。
开 T2,啥————啊???这个则呢么这么像 2021 年 J 组某到阅读程序题???我再看,好家伙这就是那玩意!于是马上在卷上写下了结论,拿最后一题一算发现结论真的是因子之和,真有这个选项!非常兴奋,于是算了一会做完了,至于其中的 \(1000\) 嘛,好像有个啥定理来着,忘记了,我就猜他相同。结果考完发现两个函数在干同样的事,好家伙去年 J 组也是这么搞,CCF 真会出题。
开 T3,啥啊原来是个二分答案题,算算就写完了,结果考完发现直接怒错两个选择,复杂度我居然选了 \(O(n \log n)\),不知道脑子在想什么。
好难,赶紧去做了完善程序。
开 T1,第一眼以为是 \(k\) 短路,心想废了。发现原来是 \(k\) 小字典序路径,那没事了,而且似乎可做的感觉。没成想错了 \(2\) 个选项,心在滴血。
开 T2,啥都不会,只会最后一个选项,其他全靠蒙,无一蒙中,心在淌血。
当然,这些大部分知道错了是在回家估分后的事。S 组最后估分是 \(63.5\) 分,看起来不高,但是在广东没理由比去年高这么多的,然后去问了一下彭老师,她也说没问题,放心了许多。也算是给这个赛季开了个好头吧。
晚上打了 ABC,由于迟到了半个多小时,于是开 Rated 后写完前四题就跑了。简单复盘一下 C 和 D。
C.Slot Strategy 2 (Easy)
题意:给定三个长为 \(n\) 的序列,可以把序列复制无数次,在三个序列分别选择点 \(i,j,k\),要求满足 \(i \ne j \ne k\) 并且 \(a_{i}=b_{j}=c_{j}\),代价为 \(\max\{i,j,k\}-1\),问最小代价。\(1 \le n \le 100\)。
sol:读了半天才发现选相同的代价不同。由于 \(n\) 很小,考虑直接暴力,枚举所有的 \((i,j,k)\),计算贡献取最小值,复杂度 \(O(n^3)\)。
D.Relative Position
题意:有 \(n\) 个点在平面上,\(1\) 号点位置为 \((0,0)\)。给出 \(m\) 个限制,每个限制形如 \((A,B,x,y)\),表示 \(B\) 的位置在 \(A\) 的位置的横坐标加 \(x\),纵坐标加 \(y\) 的位置上。对于每个点若能唯一确定位置,则输出横纵坐标;反之报告无解。\(1 \le n,m \le 2 \times 10^5\),\(1 \le x,y \le 10^9\)。
sol:看完题直觉是图论题,一开始以为拓扑排序,但发现无法建图;后来又想了并查集,判断某个点是否已经和 \(1\) 节点在 统一集合,很显然也是错的;再后来发现直接建无向图跑 bfs 往外扩展就行了,很好写,由于每个点只会被扩展一次,所以复杂度为复杂度 \(O(n+m)\)。
9.18
回华英遇到了彭老师,跟她讨论了一会,结果是 J 分数线大概 \(75\),S 分数线大概 \(60\)。
中午彭老师跟我和 lzh 说复赛后准备个简历交给 lgj,没听懂要干啥/kk
9.23
模拟赛被爆砍。T1 怒挂 \(80\)pts,原因是体面表述有误,OI 赛制还我青春,最后只切了 T2,喜提垫底。
下午和 lyt 在机房打了月赛,直接多人共号怒写 \(235\)pts。lyt 真是上大分了。
晚上 ABC。状态不好,写完 D 已经花了 \(50\)min 了,不知道这么脑残的题目怎么写这么久的,E 也是恶心题,再见。不过最近的 D 怎么比 C 还简单,还不止一场。
9.26
初赛出分,J80,S63.5,应该两个组都过了。
lzh S70.5,非常强大,cjh S91,超级强大。
9.30
GD 出分数线了,J68,S46.5,两个都是 A 类晋级。
今年广东搞了 \(2600+\) 机位像是要圈钱跑路似的。
晚上和 lyt 组队 ABC322。我俩约定我做双数,他做单数。
开场 \(5\) 分钟左右 lyt 也是秒切 A 和 C,龟速的我又过了几分钟才过 B。
当我为 D 极其恶心的大模拟而苦恼的时候,lyt 已经无伤切掉 E 了,于是我让 lyt 先看 D,我去 F 瞅瞅。
结果是他不会 D,我也写不出 F 的数据结构。
但切不掉 D 总觉得过不去,于是死磕 D,想到了一种稍微好处理的,就是把地图翻四次然后暴搜的做法,在结束前 \(6\) 分钟极限过了,还是一发。最后我俩搞掉了 A-E,without 罚时。然后去看 E 是啥,发现原来只是个五维背包。
赛后惊奇地发现 F 撞原题了,P2571,无语。
结果是直接加了 \(120\) Rating,上绿了。
第二天发现 AT 给 D 的评分居然超过了 \(1300\),平衡了。
10.1
祖国母亲 \(74\) 岁华诞快乐!
下午偷偷用 lyt 的号水月赛,结果是先切 T2 后切 T1,T1 不会用 std::map
所以写了哈希。也是偷偷帮他上分了好吧。
晚上复习化学,白天历史背死我了。
10.6
模拟赛 \(100+100+60+80=340\) pts rk \(1\)。
T1 是简单进制分解,T2 是很烦的二维异或前缀和,T3 不会,T4 图论。
评价:好不容易会了 T4 的图论,结果 WA 在了两个小数据是什么操作。你 ss 怎么还在 pj 出 ST 表呢,是不是玩不起?虽然说 lgj 经常拿数论题来薄纱我。
10.9-10.11
HY 段考一。
silly dog 华英。
人才华英。
一起见证华英的险恶:10.11 上午刚刚考完,下午回教室发现黑板上的“距离段考一”已经改成了“距离段考二”,我********************。
csp rp 直接暴涨。
upd:rk \(66\),寄。
10.14
CSP-J2/S2 倒计时 \(7\) days.
模拟赛 \(390\) pts 喜提 rk \(1\)。
又是会 T4 不会 T3,怎么一直这样。
于是 T3 暴力卡时 \(100\),赛后发现暴力的过程中已经包含了最优解???
下午月赛。T4 一眼滚动数组 dp,深知自己 dp 的薄弱于是写了记忆化搜索,发现有 \(65\) 分(upd:T 成了 \(45\) pts)。
晚上 ABC,CSP 2023 前最后一场 ABC。
upd:切了 \(5\) 题,信心大涨。
D:考虑到暴力全排列 \(O(n!)\) 跑不过去,考虑枚举所有平方数,然后用字符串对其匹配,复杂度 \(O(n\sqrt{10^n})\)。
E:考虑预处理前缀最长匹配与后缀最长匹配,对后缀最长匹配做前缀和,复杂度 \(O(n)\)。
10.15
下午急急忙忙回家打洛谷 S 模拟赛,由于没啥时间于是只写了 T1 和 T2 第一档暴力。
upd:T1 \(95\) pts,预处理 \(\log\) 没处理到 \(n+1\)。
10.20
CSP-J2/S2 倒计时 \(1\) days!!!
晚上家长会,我和 lyt 和 lzh 在机房颓废。
10.21
复赛日。
Morning J
地点:科学楼五楼电脑 3 室 3 号机位。
同考场的有初二的俩学弟。
\(8:30\) 开考,先看 T1,没有按照考前的预定策略先读完题,而是决定一题一题看。
第一眼没有思路?很慌。在草稿纸上画了画,发现每次减少长度是 \(n/3\) 的,只需要对当前序列长度是否能整除 \(3\) 简单分讨一下就行了,大概 \(8:40\) 过了。
\(8:40\) 开 T2,怎么看完题又没有思路,前面打的所有模拟赛从未前两题看完一点思路没有的,读好几遍题都不会,非常慌。突然想到我妈跟我说卡住了直接跳。
\(8:50\) 直接跳到 T3,果然是恶臭大模拟,怎么还考一元二次方程???于是背景部分直接不看,发现是要按形式输出 \(\max(x1,x2)\),于是按照题目开码,写得异常顺利,写完没调多久就过了大样例,此时大概是 \(9:30-9:40\) 左右。
于是 \(9:40\) 开了 T4,考图论是怎么也没想到的,读完题感觉很典,但就是不会,于是又跳回 T2。
\(10:00\) 会了 T2,发现就是个简单贪心,从左往右扫描,维护最近的价值更小的点即可。写完过了大样例。
很担心 T2 挂掉,于是上了个拍子。结果一下拍出来了,很害怕假掉,调了一下发现是 i++
位置放错了,调了一下就过了拍。
\(10:50\) 感觉 T4 \(a_{i}=0\) 的部分是二分最短路,写完发现假了/kel
后面这大半小时都是在 T4 想这想那中途还给 T1 上了个拍,T3 没法拍。
\(11:40\) 发现 T4 \(k=1\) 的情况就是最短路板子,有 \(20\) 的包,于是赶紧码了,在结束前 \(5\) 分钟过了手造样例。
估分 \(100+100+100+40=340\),不过这是考场算的好像算错了/kk
出来后和同学一讨论,发现自己脑抽 T3 算错复杂度于是预处理的所有数的最简根式,居然写到了 \(9 \times 10^6\),这玩意套个 \(\log\) 会不会寄啊???血压一下上来了。
吃饭包括中午睡觉的时候都在慌,由于我没管值域,所以一处理就是到上界的,现在 T3 \([0,100]\)。不过想到当时测大样例一下跑出来了所以也没有很在意。
Afternoon S
地点:飞鸿楼三楼电脑 8 室 35 号机位。
整个机房好多佛一的啊,还见到了去年的学长,lby 坐我右后方。
\(14:30\) 开题,依旧按照上午的策略一题题做。发现 T1 只要枚举全排列就行了,大概写了 \(40\) 分钟。
\(15:10\) 开 T2,想了个假结论:区间 \([l,r]\) 是可消除的当且仅当由若干组回文串组成。\(O(n^2)\) 写完后被大样例叉了。于是只能写 \(O(n^3)\)。
后面时间都记不清了。
开 T3 又是大模拟,S 考大模拟真是怎么都想不到,而且语文又不好根本读不懂题,就随便写了性质 A,又没样例,也不知道写的对不对。
T4 暴力都感觉不好写,想到第一档分如果搞个菊花图不就被卡成 \(O(n!)\) 全排列了吗,非常寄。
后面就是 T2、T3、T4 反复横跳,愣是没去 check T1。
于是最后出来感觉 \(100+35+15+0=150\)。
结果听他们一说 T1 不能反方向翻转,于是假了,原地升天。
Evening
跑去估分。
在回去的路上 pjy 告诉我说小图灵 J \(325\),T3 好歹是没被卡,但是 T4 怎么挂了 \(15\)?
lq T4 没判无解,在这只被卡了 \(10\) 分,说不定在 CCF 那里要死了也说不定(?
奉上各大网站估分情况:
J 组:
小图灵:\(100+100+100+25=325\)
计蒜客:\(100+100+100+35=335\)
洛谷:\(100+100+100+30=330\)
云斗:\(100+100+100+0=300\)
云斗好像 T4 ML 只开了 \(256\mathrm{M}\),搞的我一上来就 MLE,不管了。
S 组:
考的奇烂,T1 还挂成 \(60\) 分了,人没了。
分别是 \(105\)、\(95\)、\(95\)、\(115\),依托答辩。
写在最后
这里是一些心得。
去年的 J 组也就 \(200\) 分,写 T2 写 \(2\) 个小时。今年已经有很大进步了。
S 组二等也是意料之中,咱们又没有天赋,老天能给 J 组上了 \(300\) 已是极度仁慈,又怎么要求 S 组这样那样呢?
晚上 gzy 跟我说考得很烂,T2 数组太大 MLE 了,最后只有 \(100\)。惊讶吗?考之前 gzy 肯定有一等实力的,但是计划哪里赶得上变化,除了自身原因外,CCF 今年真是乱搞,S 整场打下来我根本不觉得是在打 S,更像是一场锻炼 J 组码力的比赛(虽然都不会),T3 放大模拟更是前所未见。
OI 这种东西永远不知道结局会怎么样。
如果还有一次机会,明年肯定 S 一等了。但是鬼知道还有没有明年。如果高中能去 SM 那还能再战个一两年,反之那就退役,没什么大不了的,不是人人都能成为神犇。
gzy 真是意难平了,不过我还是祝愿 SS 能给个机会/bx。
就这样。