NOIP 2023 游记

坐标 SH 的蒟蒻。

本来就没拿多少,自测还挂了 20 多分,一等奖应该是没了。

把游记写了就赶紧退役了吧。

其实这是一篇四合一游记,为了纪念这两周“充实”的生活。除了 NOIP 之外还参加了几场只有上海有的比赛,但其他比赛都很诡异,所以只是把日记里的东西粘出来而已,供以后想要报的人参考(如果真的能够看到这篇游寄的话……)。

为什么大家都 200+ 啊,我只有 120,都不敢投游记了。

想起下午看到一个 SH 的大佬问 200+ 是不是寄了……

很难受,很无助,有没有人管管……

东西好多啊,应该没人会想看吧,就当我自嗨了。

2023 学年上海市中学生信息科技学科竞赛

2023.11.11,下午。

上午在学校上课,中午吃完饭去复兴,早到了好久,周围也没什么地方可以逛的。找了个全家,再去旁边罗森,再走回来,一共才十分钟……

还好很早就让进了。开场还有领导讲话……srds 就是考生须知……看准考证号就 60 个人参加比赛,感觉悬……
image

image
5 单选 5 填空 5 程序,满分 120
image

选择:栈、希尔排序、二叉树前中后序遍历互推、哈夫曼编码、人工智能算法概念
希尔排序、哈夫曼编码、人工智能。都是我的盲点,开幕雷击。

填空:卷积网络概念、ipv6、最短路(和 csp-s2021 初赛 T15 很像)、两道数学题
又是雷击,直接整傻掉了。

程序:

第一题推结论贪心,我的想法是,首先场上 bi 最大的那一个肯定是给小 B 的,此时小 A 的最优策略就是保下场上剩下珠宝中 ai 最大的那一个,然后就按照这个做就行了,范围比较小,写 O(n2) 枚举就可以了

第二题单调栈,原题 SP1805

第三题动态规划(和 CSP-S2019 初赛 T15 很像,只不过加上了障碍物),秒切
T2 是绿题,场上因为做过所以感觉难度还好,然后推测其他题难度也还行,但其实赛后想想,SP1805 是绿题啊!这范围 105 拉满了啊!这肯定比 T3 难啊。第三题才是真简单,但 n20 这个范围就很奇怪,明明有线性接法,难道这题只要求枚举?DP 不在考纲?

第四题不确定,范围特别小感觉没有多项式复杂度的解法,但我猜了个结论出来…… O(1) ……感觉要挂……

第五题可能是 dfs 枚举,和上次 wsg 个人赛(SHCSP)T2 很像,走格子,可以往三个方向,有后效性,没写出来……

考试的机子是 win7,32 位,devc++5.1,可以编译运行但不能 debug,我看是缺个什么文件,感觉监考来了也弄不好,就没说,拿 cerr 手调。

编译用的 c++版本,要不要写文件输入输出都不确定,监考说这个不能说……

感觉监考像是临时抓过来的,都不懂考试内容……一个老爷爷,一个胖胖的,两个人看着还挺 nice 的,没有什么压迫感。

厕所管的很严,还要有个老师跟着,但电脑间隔板不升起来的……

考生须知和卷子上对文件夹结构的要求不一样……我问了下,按照卷子上来,新建一个 准考证号+空格+中文名字 的文件夹,cpp 文件全部直接放在这个文件夹。但考试结束还是要贴张便签写自己的文件名……

还有个小细节,卷子上写的直接输出答案不给分,这就很奇怪了,难道说测试点只有给的样例?难道还要人工审核代码?还是说不允许打表?

这比赛处处充满了诡异的感觉……

update 2024.01.05:确实是挂了,没奖。30 多个人拿奖呢呢,感觉不能连个三等奖都没,难道是因为写了文件输入挂了?

第二十二届上海市青少年计算机应用操作竞赛(控江杯)

2023.11.12,早上。

九点半左右出门,差不多早了五分钟,门口小排了个队,一路听过去好像初中组都在说难,突然有点慌。

image

进去的时候又看到那个胖胖的老师了,应该是主办方的人,不是复兴的老师。

然后书包直接放身边,手机关机放进去,这真的离谱……

考场电脑依然是 win7,但比复兴的电脑好一点,有搜狗输入法,流畅了很多。

看到 D 盘有一个什么育才计划的文件夹,里面放了个输出 wssb 的 cpp 文件,没绷住٩(๑>◡<๑)۶

纸质试卷,全程没有数据范围,python 输入的时候还要加提示语句,不知道逗号是中文还是英文版本的,不知道英文字母和中文之间有没有空格……

第一题写的 bfs,可能会超时。比较奇怪的是它是对 109+7 取模,一般不都是 1e9+7 嘛,但最后一分钟也没来得及问。出来问了下老师做法,好像没有比 bfs 更优的做法了,除非它有数学解。这样一看 109+7 倒也合理。

第二题一眼递归,绕着边上调用一遍就可以了,但不会输入所以没写。python 可以直接输入二维数组的吗?

第三题一开始想把 X 去掉,一样就输出 True,然后想到字符串长度可能不同,然后再看到 XR,RX 这组数据想到要判断方向,最后改了下,变成往里面加 X,感觉好写一点。这题调得比较久,应该能对。

第四题一眼双指针,再开个桶搞两下,秒了。

第五题,没范围,直接写立方枚举,可能会超时。问了下,好像说这题线性接法要用到一个什么后缀数组,不管,肯定没人写得出来,稳。

总之,依然是一场很离谱的比赛。

出来听了一路,大家都觉得今年这场很难,乐,感觉是出题人完全没有考虑算法的问题,就只要把功能实现出来就行了。

update 2023.12.12:一等奖,全上海就四个,乐。

上海市华理化工杯化学竞赛(华理杯)

2023.11.12,下午

提早半个小时到的,去全家买了三瓶水,两瓶大红袍、一瓶维 C。

image

听了别人的鬼话,进门左转,找到了快递驿站……回头,看到原来有路标……

原来是直走再左转。

考场在三楼上楼走到底,四个监考,3 女 1 男,那个男老师看着挺和善的,还跟我们开玩笑说不要觉得太简单就早交卷子。

一小时选择题做完去上厕所,厕所不太行。

接下来一个半小时填空题真的坐牢。

其他也没什么好写的了,毕竟不是搞化学的,没有能力评价卷子。贴几张同学拍的照片吧。

image

image

image

image

image

image

看到最后这张照片,突然想起来,那天初赛结束从紫竹回来也是走的这里。

update 2023.11.24:30.5+31=61.5,死得很彻底。当然参加这个比赛纯粹就是看乐子,但没想到这么坐牢。

NOIP 2023

2023.11.17,晚上。

礼拜五放学,请别人吃了顿 KFC,想着积点功德,结果吸引来了一群 sb 抢我吃的……

真是……

image

晚上回家汇总了下写过的几篇题解,写了篇讲分块的文章,想着退役前能多留下点东西。再翻了翻之前写的复习复赛的内容,挂了会电子木鱼,12 点左右睡的觉。

2023.11.18,早上。

07:20,起床,天好冷冷冷冷冷冷。

往复习复赛的那篇文章里加了几句加油的话,再发了一遍。

07:56,去七宝的路上……

image

学校在装修,整个一个废土风。
上次来七宝还是在中考自招的时候。好像是语数英物化连做三小时?有点记不清了,反正自招被刷掉了,印象比较深的是当年那场自招的英语作文基本押中了当年的中考作文,所以我中考英语状态特别好,出来跟别人吹了好久。

08:06,进考场,有热空调,感动。

08:11,试了下键盘什么的。桌子抽屉是塌掉的。感觉键盘手感很好,声音很脆,但上下左右键的位置有点不舒服。
手冻僵了。找了一下厕所,竟然有热水,感动。
电脑里下发文件夹有一个 NOIP2023 注意事项,但其实是 CSP-S 的注意事项,改了个名字哈哈哈哈哈哈哈。还有一个考前宣读 pdf,一个教怎么用虚拟机的视频,一个 down.zip。多的那个 encrypt-day1.zip 不知道有什么用。
进场就断网了,但看隔壁在用 vscode,难道之前有网?

08:23,dowb.zip 压缩包密码:T#YMS@4。
看到 dict 真的有点害怕,想起了被 struct 支配的恐惧。
突然有点怅然若失,怎么这么快就要退役了。

08:32,pdf 密码:Y@T2L32#。
开题。
T1 直接输出 1 能拿十分。

08:41,n26,m=1 的 40 分到手,每次只有最小的那一个字符可以,其他都不行。

08:45,T2 没什么思路,但 n=10 可以拿 20 分。

08:49,T3 题都读不懂。

08:51,T4 感觉像个背包或者什么,第 1、2 个点说不定能暴力拿下

9:11,T2 暴力 20 分,40+20+0+0。打算再看一遍 T1。

9:32,T1 拿下,大样例不开 O2 是 2.7 秒,开 O2 是 0.7 秒。
不限次数的交换等价于排序。把第 i 个字符串从大到小排序,其余字符串由大到小排序,每次从中取最小的那一个,用堆维护。如果堆顶的那个字符串是 si,那么把它删掉,做完再加回去。O(nmlogm)
这样想好像维护前 2 小的就可以了,但懒得改了。

9:59,T3 题读懂了,要求一个拓展中的数严格小于或大于另外一个。
正解应该要求单次 O(1) 左右,先把 n,m=1 的 5 分拿下。

10:10,上完厕所回来,想 T2,感觉像并查集。

10:16,T2 感觉不是我能做的,T3 先拿点再说。

10:44,还有 2h,T3 卡住了,有点慌。

10:55,T4 暴力可以优化,拿下 8 分问题不大。

11:22,T4 暴力写完,搓的垃圾数据测了一下,时间够用,100+20+10+8

11:27,上完厕所,回来吃点东西。

11:52,T2 第 3、4 个点再拿 20 分,接下来接着看 5、6。

12:01,做不出来,T2 放弃。

12:05,感觉 T4 像 DP。

12:27,T4 的 DP 写挂调到现在,拿暴力拍了半天没拍出来,感觉 DFS 也挂了。

12:38,还是没调出来,100+40+10+0。

12:47,可以放弃了,基本就是 150 分了。

12:54,上完厕所回来,等着交卷。有点难受,感觉题思路都很明显,但就是想不出那个正解。

13:00,收卷子。交得比较慢,出来晚了。估分:100+40+10+0。

image

update 2023.12.11:寄透了,118,三等。搞竞一年,分数涨了 10 分,分数涨了 100 分……隔壁化竞高分喷雾喷卷子上的,这里直接喷分数线上的……

赛时代码

T1

#include <bits/stdc++.h>

using namespace std;

const int MAXN=3005;
int n, m;
string s[MAXN];

namespace case1
{
	void solve()
	{
		string mins = s[1];
		for (int i = 2; i <= n; ++i) {
			if (s[i] < mins) { mins = s[i]; }
		}
		for (int i = 1; i <= n; ++i) {
			if (s[i] == mins) { cout << 1; }
			else 		   	  { cout << 0; }
		}
	}
}

namespace case2
{
	struct node {
		int id;
		string ori, up, dw;
		bool operator < (const node &x) const {
			return dw > x.dw;
		}
	};
	
	string sorted_str(string ori, bool is_up)
	{
		// is_up : 1从小到大,0从大到小
		if (is_up) { sort(ori.begin(), ori.end()); }
		else       { sort(ori.begin(), ori.end(), greater<char>()); }
		return ori;
	}
	
	void solve()
	{
		priority_queue <node> q;
		for (int i = 1; i <= n; ++i) {
			q.push(
				(node){i, s[i], sorted_str(s[i], true), sorted_str(s[i], false)}
			);
		}
		for (int i = 1; i <= n; ++i) {
			bool need_push_back = false;
			node c1 = q.top();
			node c2 = q.top();
			if (c1.id == i) {
				need_push_back = true;
				q.pop();
				c2 = q.top();
			}
			if (sorted_str(s[i], 1) < q.top().dw) { cout << 1; }
			else                                  { cout << 0; }
			if (need_push_back) { q.push(c1); }
		}
	}
}

int main()
{
	freopen("dict.in", "r", stdin);
	freopen("dict.out", "w", stdout);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> s[i];
	}
//	if (m == 1) { case1::solve(); }
	case2::solve();
	return 0;
}

T2

#include <bits/stdc++.h>

using namespace std;

int c, t, n, m;

namespace case1
{
	const int MAXN=15;
	int ans=INT_MAX, val[MAXN], mvl[MAXN];
	
	struct ope {
		char v;
		int x, y;
	} op[MAXN];

	int turn_val(char op, int ori)
	{
		if (ori == 2) { return ori; }
		return (op=='+'? ori: (ori==1? 0: 1));
	}

	int get_val(char v)
	{
		switch (v) {
			case 'T': return 0;
			case 'F': return 1;
			case 'U': return 2;
			default : return 114514;
		}
	}

	bool check()
	{
		for (int i = 1; i <= n; ++i) { mvl[i] = val[i]; }
		for (int i = 1; i <= m; ++i) {
			if (op[i].v == '+' || op[i].v == '-') {
				mvl[op[i].x] = turn_val(op[i].v, mvl[op[i].y]);
			} else {
				mvl[op[i].x] = get_val(op[i].v);
			}
		}
		for (int i = 1; i <= n; ++i) {
			if (val[i] != mvl[i]) { return false; }
		}
		return true;
	}

	void dfs(int i, int cnt)
	{
		if (i > n) {
			if (check()) { ans = min(ans, cnt); }
			return;
		}
		// 0:T, 1:F, 2:U
		for (int j = 0; j <= 2; ++j) {
			val[i] = j;
			dfs(i+1, cnt+(val[i]==2));
		}
	}
	
	void solve()
	{
		ans = INT_MAX;
		cin >> n >> m;
		for (int i = 1; i <= m; ++i) {
			cin >> op[i].v;
			if (op[i].v == '+' || op[i].v == '-') {
				cin >> op[i].x >> op[i].y;
			} else {
				cin >> op[i].x;
			}
		}
		dfs(1, 0);
		cout << ans << endl;
	}
}

namespace case2
{
	const int MAXN=1e5+5;
	int ans;
	bool is_U[MAXN];
	
	void solve()
	{
		cin >> n >> m;
		for (int i = 1; i <= m; ++i) {
			char v;
			int x;
			cin >> v >> x;
			if (v == 'U') {
				ans += (!is_U[x]);
				is_U[x] = true;
			} else {
				ans -= (is_U[x]);
				is_U[x] = false;
			}
		}
		cout << ans << endl;
	}
}

int main()
{
	freopen("tribool.in", "r", stdin);
	freopen("tribool.out", "w", stdout);
	cin >> c >> t;
	while (t--) {
		if (c <= 2) { case1::solve(); }
		else if (c <= 4) { case2::solve(); }
		else { case1::solve(); }
	}
	return 0;
}

T3

#include <bits/stdc++.h>

using namespace std;

const int MAXN=5e5+5;
int c, n, m, q, x[MAXN], y[MAXN];

namespace case1
{
	bool check()
	{
		return (x[1]-y[1])*(x[n]-y[m])>0;
	}
	
	void solve()
	{
		cout << (check()? 1: 0);
		while (q--) {
			int kx, ky;
			cin >> kx >> ky;
			for (int i = 1; i <= kx; ++i) {
				int px, vx;
				cin >> px >> vx;
				x[px] = vx;
			}
			for (int i = 1; i <= ky; ++i) {
				int py, vy;
				cin >> py >> vy;
				y[py] = vy;
			}
			cout << (check()? 1: 0);
		}
	}
}

namespace case3
{
	int lim_in_arr(int arr[], int sz, bool is_max)
	{
		int maxn=0, minn=INT_MAX;
		for (int i = 1; i <= n; ++i) {
			maxn = max(arr[i], maxn);
			minn = min(arr[i], minn);
		}
		return is_max? maxn: minn;
	}
	
	bool check()
	{
	}
	
	void solve()
	{
		cout << (check()? 1: 0);
		while (q--) {
			int kx, ky;
			cin >> kx >> ky;
			for (int i = 1; i <= kx; ++i) {
				int px, vx;
				cin >> px >> vx;
				x[px] = vx;
			}
			for (int i = 1; i <= ky; ++i) {
				int py, vy;
				cin >> py >> vy;
				y[py] = vy;
			}
			cout << (check()? 1: 0);
		}
	}
}

namespace case4
{
	int lim_in_arr(int arr[], int sz, bool is_max)
	{
		int maxn=0, minn=INT_MAX;
		for (int i = 1; i <= n; ++i) {
			maxn = max(arr[i], maxn);
			minn = min(arr[i], minn);
		}
		return is_max? maxn: minn;
	}

	bool check()
	{
		// 必然满足x[1]<y[1]
	}

	void solve()
	{
		cout << (check()? 1: 0);
		while (q--) {
			int kx, ky;
			cin >> kx >> ky;
			for (int i = 1; i <= kx; ++i) {
				int px, vx;
				cin >> px >> vx;
				x[px] = vx;
			}
			for (int i = 1; i <= ky; ++i) {
				int py, vy;
				cin >> py >> vy;
				y[py] = vy;
			}
			cout << (check()? 1: 0);
		}
	}
}

int main()
{
	freopen("expand.in", "r", stdin);
	freopen("expand.out", "w", stdout);
	cin >> c >> n >> m >> q;
	for (int i = 1; i <= n; ++i) { cin >> x[i]; }
	for (int i = 1; i <= m; ++i) { cin >> y[i]; }
	case1::solve();
//	if (c <= 2) { case1::solve(); }
//	if (c <= 4) { case3::solve(); }
	return 0;
}

T4

#include <bits/stdc++.h>

using namespace std;

int c, t;

namespace case1
{
	const int MAXN=25, MAXM=105;
	int n, m, k, d;
	long long ans;
	bool exer[MAXN];
	
	struct node {
		int y;
		long long c;
		bool operator < (const node &x) const {
			return y < x.y;
		}
	};
	
	vector <node> cl[MAXN];
	
	long long calc()
	{
		int tot=0, cnt=0;
		long long res = 0;
		for (int i = 1; i <= n; ++i) {
			tot += exer[i];
			cnt = (exer[i]? cnt+1: 0);
			for (node nd: cl[i]) {
				if (cnt >= nd.y) { res += nd.c; }
			}
		}
		return res-1LL*tot*d;
	}
	
	void dfs(int day, int cnt)
	{
		if (cnt > k) { return; }
		if (day > n) { ans = max(ans, calc()); return; }
		exer[day] = true;
		dfs(day+1, cnt+1);
		exer[day] = false;
		dfs(day+1, 0);
	}
	
	void solve()
	{
		ans = 0;
		for (int i = 1; i <= n; ++i) { cl[i].clear(); }
		cin >> n >> m >> k >> d;
		for (int i = 1; i <= m; ++i) {
			int x, y;
			long long v;
			cin >> x >> y >> v;
			if (y <= k) {
				cl[x].push_back((node){y, v});
			}
		}
		dfs(1, 0);
		cout << ans << endl;
	}
}

namespace case2
{
	const int MAXN=1e5+5;
	int n, m, k;
	long long d, f[MAXN][2];

	struct node {
		long long y, v;
		bool operator < (const node &x) const {
			return y < x.y;
		}
	};

	vector <node> cl[MAXN];
	
	void solve()
	{
		for (int i = 1; i <= n; ++i) { cl[i].clear(); }
		cin >> n >> m >> k >> d;
		for (int i = 1; i <= m; ++i) {
			int x;
			long long y, v;
			cin >> x >> y >> v;
			cl[x].push_back((node){y, v});
		}
		for (int i = 1; i <= n; ++i) {
			long long awar = 0;
			f[i][1] = f[i][0] = max(f[i-1][0], f[i-1][1]);
			if (!cl[i].empty()) { sort(cl[i].begin(), cl[i].end()); }
			for (node nd: cl[i]) {
				awar += nd.v;
				int bg = i-nd.y+1;
				if (bg >= 1) {
					f[i][1] = max(f[i][1], f[bg-1][0]-nd.y*d+awar);
				} else {
					break;
				}
			}
		}
		cout << max(f[n][0], f[n][1]) << endl;
	}
}

int main()
{
	freopen("run.in", "r", stdin);
	freopen("run.out", "w", stdout);
	cin >> c >> t;
	while (t--) {
		if (c <= 2) { case1::solve(); }
		else        { case2::solve(); }
	}
	return 0;
}

赛后&结语

这两周有点太充实了,人都要充爆了(没有别的意思),搞得自己压力很大,打比赛的时候状态也不好,学校里 whk 也学爆了。

三个半小时,被三道知道思考方向的题卡死,太窒息了。

甚至连 T1 都因为忘记特判挂掉 10 分。

云斗测下来分数是:90+20+5+8=123。寄透了。

一共打过 3 场正式的比赛,这次是分数挂得最多的一次,158->123,打开 pdf 一眼看到送的十分都没拿到。

update 2023.11.19:复盘了一下,T1 没特判挂了 10 分,T2 多测没清空挂 20 分,T3 没开 long long 挂 10 分,T4 状态转移方程直接就是错的。158->118。警钟敲烂。

感觉好遗憾啊。

打比赛,还是不要得失心太重,不然又没玩到又没出成绩就亏麻了。

总而言之,高三别报那么多比赛,又没用(前面三场)人又累。最好高三也别读,赶紧找个厂打工算了。

image

20 号 CSP-S 放终评成绩,过几天应该蓝勾就到账了。

再过段时间洛谷账号应该就变绿名了吧。

退役留念。

image

image

posted @   LittleDrinks  阅读(232)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示