CSP 2022 游记

本文章来自一名希望能拿一等的小六。

初赛篇

我学习算法和 C++ 是相当晚的,C++ 是在 CSP考前 76 76 76 天学的,而算法则更晚。在8月份的时候,我还参加了一个叫 “希望编程” 的比赛,拿了三等奖(现在看来这些都是送分题)。我的暑假其实还算可以了,至少比 9月份的生活好。

9月份开学了,而距离CSP就只有 18 18 18 天了。然后,我妈给我买了一本《信奥一本通》。让我一直刷,复习,再刷。我当时还是很感兴趣的,也听着她的话再刷。当时确实很累,学校那烦人的作业已经耗掉我大半的精力了,回到家里的第一件事还是刷题。不过我当时并没有感到厌倦,反而越刷兴致越高。就这样我刷掉了《信奥一本通》15套模拟卷+历年真卷3套+某谷模拟卷1套。现在想起来都感觉很累,但就是不知为何当时能感觉不错。

那一天终究还是来了,我走到考场里,强迫自己冷静下来。老师把试卷发了下来,我看了看:还好,还算简单,大概能拿个 60 60 60 吧。尽管阅读题还是有点难,但我根本不慌。

随着一声铃响,考试正式开始。我首先有 30 30 30 分钟秒了第一大题(还好没有“吃人”的计算机原理、网络常识和小学奥数),稍微检查了一遍,觉得至少对 10 10 10 题。然后再看到阅读题,阅读题的第一题就差点把我给难倒,但是我在没有理解题目是嘛的情况下(当时我还认为 0x 是八进制),依旧对了两三道道判断和一个选择。然后再看到第二和第三题(这两题差点把我的心态搞崩),但是到最后还是写了几个自己会的。此时还剩一个半小时了,我的心十分紧张,知道我看到了完型,差点没忍住笑出来。用 15 15 15 分钟完成了第三大题,预计满分(当时我甚至还不知道“搜索”是什么意思,但根本不影响满分)。最后,我再改了几个答案,检查完无误后,结束铃正好想了起来。

(我旁边还有一个五年级的,一边玩草稿纸纸飞机一边写,还不用草稿纸,两个全写完。写完后还把草稿纸折成纸枪。)

后面就是等成绩了。一周后,我终于在连续 5 5 5 个小时的搏斗中查到了分数: 71 71 71 分!这对我来说已经算高的了,在“0基础”(其实也不是“0基础”,学过一年的Python,但只是学了关于自动化、数据库开发、游戏开发、网络爬虫、Flask等,没有学算法)的情况下,依旧拿到了 71 71 71 分的好成绩!

国庆节当天,广东开放了查分数线。我在查成绩之前和老爸说过,要是我没过就不过生日了(我生日是 9.28)。然后一查,分数线是 69.5 69.5 69.5 ,当时我高兴得跳了起来,后面问了一些人才知道,那次很多人都是 69 69 69 ,包括练习时长两年半的,无缘复赛。

接下来就是复赛了!

复赛篇

我的复赛可以说是一塌糊涂,从任何方面来讲。写真题的时候几乎没有出现过达到当年一等线的,CSP2019也就 240 240 240 分,20年 230 230 230 ,21年题简单一点,拿了 322 322 322 分。而且我的备赛态度极其恶劣,每天就是刷刷B站,打打游戏而已。

到了考场上,我还是比较轻松的。毕竟21年的题也不难,22年的题应该也不会太难。

考试开始。首先翻了翻第一题,看了一下数据范围就不会了。看了一下 1 ≤ a , b ≤ 1 0 9 1 \leq a, b \leq 10^9 1a,b109,并且自己也没有提前背快速幂模板,当时就慌了。再次思考后,我突然想到可以特判 a = 1 a=1 a=1 的情况 ,这样即使 a = 2 , b = 1 0 9 a=2,b=10^9 a=2,b=109 也不会超时。我大喜过望,用了约 10 10 10 分钟便很快写好了,打好 freopen 后测试完,总共用了半个小时。

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

const int MAXN = 1e9;
long long a, b, ans;

int main(){
	freopen("pow.in", "r", stdin);
	freopen("pow.out", "w", stdout);

	scanf("%d %d", &a, &b);
	
	if (a == 1){
		printf("1");
		return 0;
	}
	
	ans = a;
	for (int i=1; i<b; i++){
		ans *= a;
		if (ans > MAXN){
			printf("-1");
			return 0;
		}
	}
	
	printf("%lld", ans);
	
	return 0;
}

到第二题,我一看到题就知道是推数学的,但我不到该怎么推,也没有想过用二分。写了个暴力,本来预计 60 60 60 的,但是没有判断整除。大样例运行了 18 18 18 秒,但我依然无所畏惧。

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

int k;

long long n, e, d, p, q;

bool ok;

int main(){
	freopen("decode.in", "r", stdin);
	freopen("decode.out", "w", stdout);
	
	scanf("%d", &k);
	for (int i=1; i<=k; i++){
		scanf("%lld %lld %lld", &n, &e, &d);
		p = 1;
		ok = false;
		while (p*p <= n){
			q = n / p;
			if (d*e == (p-1) * (q-1) + 1){
				printf("%lld %lld\n", p, q);
				ok = true;
				break;
			}
			p++;
		}
		
		if (!ok) printf("NO\n");
	}
	
	return 0;
}

第三题整整卡了我一个半小时,这也是我本次考试最大的败笔。我写了一个不算搜索的搜索,结果其实和骗分没有区别。当时真的十分着急,但字符串的知识不熟让我只能干着急。

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

int cnt1 = 0, cnt2 = 0;

bool v;

string expr;

bool computing(string expr){
	int ind1, ind2;
	bool v, c;
	
	while (expr.find('(') != expr.npos){
		c = false;
		for (int i=0; i<int(expr.size()); i++){
			if (expr[i] == '('){
				ind1 = i;
			}else if (expr[i] == ')'){
				ind2 = i;
				expr.replace(ind1, ind2-ind1+1, to_string(computing(expr.substr(ind1+1, (ind2-1) - ind1))));
				c = true;
			}
			if (c) break;
		}
	}
	
	bool a, b;
	
	while (expr.find('&') != expr.npos){
		c = false;
		for (int i=0; i<int(expr.size()); i++){
			if (expr[i] == '&'){
				a = (expr[i-1] - '0');
				b = (expr[i+1] - '0');
				if (!a) cnt1++;
				expr.replace(i-1, 3, to_string(a&&b));
				c = true;
			}
			if (c) break;
		}
	}
	
	while (expr.find('|') != expr.npos){
		c = false;
		for (int i=0; i<int(expr.size()); i++){
			if (expr[i] == '|'){
				a = (expr[i-1] - '0');
				b = (expr[i+1] - '0');
				if (a) cnt2++;
				expr.replace(i-1, 3, to_string(a||b));
				c = true;
			}
			if (c) break;
		}
	}
	
	return expr[0] - '0';
}

int main(){
	freopen("expr.in", "r", stdin);
	freopen("expr.out", "w", stdout);
	
	cin >> expr;
	if (expr.size() == 5){
		if (expr[1] == '&'){
			if (expr[3] == '&'){
				if (expr[0] == '0') cnt1++;
				v = (expr[0] - '0') && (expr[2] - '0');
				if (!v) cnt1++;
				v = v && (expr[4] - '0');
			}else{
				if (expr[0] == '0') cnt1++;
				v = (expr[0] - '0') && (expr[2] - '0');
				if (v) cnt2++;
				v = v || (expr[4] - '0');
			}
		}else{
			if (expr[3] == '&'){
				if (expr[2] == '0') cnt1++;
				v = (expr[4] - '0') && (expr[2] - '0');
				if (expr[0] == '1') cnt2++;
				v = (expr[0] - '0') || v;
			}else{
				if (expr[0] == '1') cnt2++;
				v = (expr[0] = '0') || (expr[2] - '0');
				if (v) cnt1++;
				v = v || (expr[4] - '0');
			}
		}
		printf("%d\n%d %d", v, cnt1, cnt2);
	}else{
		cout << computing(expr) << endl;
		printf("%d %d", cnt1, cnt2);
	}
	
	return 0;
} 

到了第四题就只剩半小时了,当时一直不知道哪里会 RE ,到了考试的最后一秒也没有调出来,而且 cmp 函数也写错了,再加上调试代码也没有删掉……最后才知道是scanf 没有加左值引用,警种敲烂!!

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

struct Point{
	int x, y;
}points[MAXN];

bool cmp(Point a, Point b){
	if (a.x == b.x) return a.y > b.y;
	return a.x > b.x;
}

int n, k;

int main(){
	freopen("point.in", "r", stdin);
	freopen("point.out", "w", stdout);
	
	scanf("%d %d", &n, &k);
	
	printf("2\n");
	if (k == 0){
		
		for (int i=1; i<=n; i++) scanf("%d %d", points[i].x, points[i].y);
		sort(points+1, points+n+1, cmp);
		
		printf("1\n");
		int m = 1, now = 1;
		for (int i=1; i<n; i++){
			if ((points[i].x == points[i+1].x - 1 && points[i].y == points[i+1].y) || (points[i].y == points[i+1].y - 1 && points[i].x == points[i+1].x)) now++;
			else m = max(m, now), now = 1;
		}
		
		printf("%d", m);
	}else{
		printf("%d", n+k);
	}
	
	return 0;
}

我考完之后已经十分疲惫,然后我妈此时还打来电话说我PET 139 139 139 分,差一分过。我当时真的崩了呀。

总的来说,我这一次不仅没有经验,而且在算法熟练度和思维以及时间的管控都有待提升(翻译:差的要死) 。

后面查到分数,有 160 160 160 分,这个分数在我的意料之中,没有任何波澜。到了17号当天,我还是查了一下分数线,GD这边的一等线是 225 225 225 ,感觉已经算低的了。但是我刚好到了全国一等基准线,也算是“上帝”给我的一种安慰吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值