2024 CSP-j 游记

TianJiajun-chaqjs / 2024-12-29 / 原文

第一轮 初赛

9-20

距离 CSP-J 第一轮仅剩 1 天。

晚上听了 MX 的初赛课,听说很有可能靠背包,直接懵逼。

9-21

距离 CSP-J 第一轮仅剩 0 天。

完了完了今天就要考试了好慌。

早上 \(6:30\) 坐着车前往烟台考点,路上看了一下计算机相关的知识就开始摆了。

\(7:40\) 到达,刚好看见了 @qp ,探讨了一下位运算的异或就进考场了。和 @qp 、@Tobeconfirmed 、@HenryGe 在一个考场,不慌了。

发卷了。选择题第三题又是讨厌的排列组合,算了半天没算出来,选了个 \(D\) 了事。第四题紧接着就是什么雷格码,根本没学过(有可能我太弱了),蒙了个 \(C\) 就过了。

其他的话都很简单,考完直接跑路。

上洛谷找了民间答案,对了一下,\(92.5\),太水了吧???

9-22

姜Sir 发成绩了,我果然是 \(92.5\) ,惊掉下巴。

膜拜 @gbrain 考了 \(98.5\) 全市第一。

9-24

又下通知了,28和29不管选啥都算对,可惜我没有,还是 \(92.5\)

不过 @gbrain 这下变成了 \(100\) 分,五体投地。

第二轮 复赛

10-25

距离 CSP-J 第二轮仅剩 1 天。

上了一上午的学,下午出发。

早晨被要求把信息学竞赛介绍给班主任和语文老师,吐了。不过也是在她们面前好好夸了一下大二中信竞队。

下午2点从烟台出发,5点半到达日照。吃饭时遇见了 @qp、@_yysq 和 @Tobeconfirmed,然后去试机。和 @Tobeconfirmed、@szh0929在一个考场,还行。

10-26

距离 CSP-J 第二轮仅剩 0 天。

\(6:50\) 起床,吃完饭 \(7:40\) 出发。坐在车上和 @qp 聊了一下时间的分配问题,姜Sir 在车上不断地强调重点,直接进考场。

\(8:17\) 在座位上坐好,把 c++14 和 O2 开好,等着公布试题密码。

把选手目录解压好后用了 \(10 \text{min}\) 读了一遍题,直接做T1。很简单,直接去重然后用 \(52\) 一减即可。\(30 \text{min}\) 搞定。

#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int N = 1e2 + 5;

int n;
int p[N];
// 令:D方块为1,C草花为2,H红桃为3,S黑桃为4  

int main(){
	freopen("poker.in", "r", stdin);
	freopen("poker.out", "w", stdout);
	
	cin.tie(0)->sync_with_stdio(0);
	
	cin >> n;
	for (int i = 1; i <= n; i++){
		char ch[2];
		cin >> ch;
		if (ch[0] == 'D') p[i] = 1;
		else if (ch[0] == 'C') p[i] = 2;
		else if (ch[0] == 'H') p[i] = 3;
		else if (ch[0] == 'S') p[i] = 4;
		if (ch[1] == 'A') p[i] = p[i] * 10 + 1;
		else if (ch[1] == 'T') p[i] = p[i] * 100 + 10;
		else if (ch[1] == 'J') p[i] = p[i] * 100 + 11;
		else if (ch[1] == 'Q') p[i] = p[i] * 100 + 12;
		else if (ch[1] == 'K') p[i] = p[i] * 100 + 13;
		else p[i] = p[i] * 10 + (int)(ch[1] - '0');
	}
	
	sort(p + 1, p + n + 1);
	
//	for (int i = 1; i <= n; i++)
//		cout << p[i] << " ";
	
	int cnt = 0;
	for (int i = 1; i <= n; i++){
		if (p[i] == p[i - 1]) continue;
		cnt++;
	}
	
	cout << 52 - cnt;
	
	
	return 0;
}

T2的话也非常简单,按题意模拟即可,\(1 \text{h}\) 搞定。

#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int N = 1e3 + 5;

int t;
char a[N][N];
bool vis[N][N];

// 方向:0为东→,1为南↓,2为西←,3为北↑
int fx[4] = {0, 1, 0, -1};
int fy[4] = {1, 0, -1, 0}; 

int main(){
	freopen("explore.in", "r", stdin);
	freopen("explore.out", "w", stdout);
	
	cin.tie(0)->sync_with_stdio(0); 
	
	cin >> t;
	
	while (t--){
//		memset(a, '', sizeof(a));
		memset(vis, 0, sizeof(vis));
		int n, m, k;
		int x, y, d;
		cin >> n >> m >> k;
		cin >> x >> y >> d;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
				cin >> a[i][j];
		vis[x][y] = 1;
		for (int i = 1; i <= k; i++){
			int xx = x + fx[d], yy = y + fy[d];
			if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && a[xx][yy] == '.')
				x = xx, y = yy, vis[x][y] = 1/*, cout << x << " " <<  y << '\n'*/;
			else
				d = (d + 1) % 4;
		}
		int cnt = 0;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
				if (vis[i][j])
					cnt++;
		cout << cnt << '\n';
	}
	
	return 0;
}

这时候是 \(10:00\),上个厕所清醒一下,开T3。

T3我注意到了特殊性质,但并没有放在心上,只是仅仅打了几行表就开始打暴力。于是写了将近 \(150\) 行,以为能拿 \(20\),然而后来事实证明,这种做法是错误的。而假如我能利用特殊性质找到规律,这道题我可能拿到 \(30\) 甚至 \(60\) 甚至 \(100\)。这也是这次考试我的最大失误。

出考场后,听说 @qp、@zlqwq 等各位大佬都做出了T3,而且一等分数线据说是 \(230\)。心情不太好。

11-7

其实成绩前天就出来了,只不过因为那两天期中考试,来不及写。

成绩是 \(100 + 100 + 0 + 0 = 200\)。各位大佬都是 \(230\)\(260\),一等奖肯定无缘了。不过对于我人生中的第一次 OI 比赛,确实积累了很多经验。

首先,最后两个小时的时间安排不合理。花了太多的时间打暴力,而且还是错误的,没有意识到应该先拿特殊性质的分。

其次,考试策略不足。当时赛场上并没有注意到特殊性质,如果能把特殊性质A的部分分拿到进而找到整个题的正解,一等奖肯定稳了。

纵观我加入YTEZ信竞队以来,其实并没有真正掌握一些算法,也从没有学会怎么应用。这是我没能拿到一等奖的最根本的原因。

然而这次的二等奖不代表我的信竞生涯的结束,自己选择的路跪着也要走下去,我照样可以通过我的努力进入S组并成为大佬。