CSP-J 2021 游记

CSP-J/S 认证注意事项:

……

11. 祝各位选手好运。

CSP-J1

初赛前有点小紧张。

赛前勉强做了几套试卷,然后就上考场了。

刚考完对答案的时候发现 J 组才 72,看洛谷上大家都说今年 J 组简单了 blabla,分数线肯定会升,然而我却觉得好难,那一个星期都害怕极了。。。结果分数出来了才发现洛谷那群人真是扯啊哈哈哈

S 组才 48 分,没有成功压线。(其实就算去了复赛也拿不了分。。

CSP-J2

比赛前一晚上八点在学校出发。逃掉了晚自习(尽管是星期五

去到酒店大概也九点半了,洗完澡,看了会儿凤凰台,然后就睡了。

第二天早上六点半起床,吃完自助餐(和上一年的变化不大,挺好吃的),七点二十出发。

然后进考场。

电脑好像是 Ryzen 3600,8GB 内存。

八点半开考。

密码很乱,6ewid\n16384#,监考员一开始还直接忽略最后面那个井号了。。。

打开题目,发现第一第二题题面好长,有点慌了起来…

T2 尤为毒瘤,到了 9:22 才搞完了。。。感觉挺很危险的,好怕翻车。

10:08,肝完 T3,77 行代码,写完人都瘫了。。感谢第三个样例,一个一个找情况。。。

(不知道怎么比对两个文件的内容,于是直接打开 Sublime Text 开始用查找来找不同。。。

赶紧吃了根士力架,然后去上了个厕所。

10:55,T4 过样例了,打得比 T3 轻松多了,当然也不可能拿满分。。。其实也不知道该怎么做,直接乱搞,做法非常诡异。。看看效果怎样吧,能骗到 50 分就是胜利。

还有一点,今年 NOI Linux 2 还行。(毕竟上一年给了虚拟机但是系统有密码,根本打不开,笑死)在里面编译了几次代码,虽然也没什么用。运行起来还蛮快的。


总的来说,这次考得还行。题目有点诡异,没有 dp,没有搜索,个人感觉侧重考基本功。

等成绩吧。


UPD 1 (2021/10/23 22:50):

广东源代码出了。

  1. candy:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <bits/stdc++.h>
using namespace std;
long long n, L, R;
int main()
{
	freopen("candy.in", "r", stdin);
	freopen("candy.out", "w", stdout);
	cin >> n >> L >> R;
	long long LRCHA = (R-L+1);
	long long LCN = L/n, RCN = R/n;
	if (RCN > LCN) {
		cout << n-1 << endl;
		return 0;
	}
	cout << R-LCN*n << endl;
	return 0;
}
  1. sort:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <bits/stdc++.h>
using namespace std;
int n, Q;
long long a[8005];
int idxa[8005];
bool cmp(int i1, int i2) {
	if (a[i1] != a[i2]) 
		return a[i1] < a[i2]; 
	return i1 < i2;
} 
int main()
{
	freopen("sort.in", "r", stdin);
	freopen("sort.out", "w", stdout);
	scanf("%d%d", &n, &Q);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
	} 
	for (int i = 1; i <= n; i++) idxa[i] = i;
	sort(idxa+1, idxa+1+n, cmp);
	while (Q--) {
		int type;
		scanf("%d", &type);
		if (type == 1) { // �޸� 
			int x;
			long long v;
			scanf("%d%lld", &x, &v);
			a[x] = v;
			for (int i = 1; i <= n; i++) idxa[i] = i;
			sort(idxa+1, idxa+1+n, cmp);
		} else if (type == 2) { // ��ѯ 
			int x;
			scanf("%d", &x);
			for (int i = 1; i <= n; i++) {
				if (idxa[i] == x) {
					printf("%d\n", i);
					break;
				}
			}
		}
	}
	return 0;
}
  1. network:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <bits/stdc++.h>
using namespace std;
int n;
bool checkPrevZero(const string number) {
	if (number.length() > 1 && number[0] == '0') return true;
	return false;
}
int strToInt(const string number) {
	int t = 0;
	for (int i = 0; i < number.length(); i++) {
		t *= 10;
		t += number[i]-'0';
	}
	return t;
}
bool check(const string addr) {
	int cntDot = 0, cntMao = 0;
	int dotIdx[3], maoIdx;	
	if (!(addr[0] >= '0' && addr[0] <= '9') || !(addr[addr.length()-1] >= '0' && addr[addr.length()-1] <= '9')) return false;
	for (int i = 0; i < addr.length(); i++) {
		if (addr[i] == '.') {
			if (cntDot > 2) return false;
			if (!(addr[i-1] >= '0' && addr[i-1] <= '9')) return false;
			cntDot++;
			dotIdx[cntDot-1] = i;
		} else if (addr[i] == ':') {
			if (cntMao > 1) return false;
			if (!(addr[i-1] >= '0' && addr[i-1] <= '9')) return false;
			cntMao++;
			maoIdx = i;
		} else if (!(addr[i] >= '0' && addr[i] <= '9')) {
			return false;
		}
	}
	if (!(cntDot == 3 && cntMao == 1)) return false;
	if (maoIdx < dotIdx[2]) return false;
	string n1 = addr.substr(0, dotIdx[0]),
	       n2 = addr.substr(dotIdx[0]+1, dotIdx[1]-dotIdx[0]-1),
	       n3 = addr.substr(dotIdx[1]+1, dotIdx[2]-dotIdx[1]-1),
		   n4 = addr.substr(dotIdx[2]+1, maoIdx-dotIdx[2]-1),
		   n5 = addr.substr(maoIdx+1, addr.length()-maoIdx-1);
	//cout << n1 << " " << n2 << " " << n3 << " " << n4 << " " << n5 << endl;
	if (checkPrevZero(n1) || checkPrevZero(n2) || checkPrevZero(n3) || checkPrevZero(n4) || checkPrevZero(n5)) return false;
	if (n1.length() > 3 || n2.length() > 3 || n3.length() > 3 || n4.length() > 3 || n5.length() > 5) return false;
	int a = strToInt(n1), b = strToInt(n2), c = strToInt(n3), d = strToInt(n4), e = strToInt(n5);
	if (a > 255 || b > 255 || c > 255 || d > 255 || e > 65535) return false;
	return true;
}
int serversNum = 0;
map<string, int> servers;
int main()
{
	freopen("network.in", "r", stdin);
	freopen("network.out", "w", stdout);
	cin >> n;
	string op, ad;
	for (int i = 0; i < n; i++) {
		cin >> op >> ad;
		if (!check(ad)) {
			cout << "ERR\n";
			continue;
		}
		if (op == "Server") {
			if (servers[ad] != 0) {
				cout << "FAIL\n";
				continue;
			}
			servers[ad] = i+1;
			cout << "OK\n";
		} else if (op == "Client") {
			if (servers[ad] == 0) {
				cout << "FAIL\n";
				continue;
			}
			cout << servers[ad] << endl;
		}
	}
	return 0;
}
  1. fruit:

(代码非常奇妙,思路十分无理,建议不要看)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <bits/stdc++.h>
using namespace std;
struct node {
	int idx;
	int val;
	int ai;
	int len;
};
int n;
int a[200005];
vector<node> sons[405005];
int nodeNums = 1;
void buildtree(int root, int left, int right, bool rrr) {
	if (rrr) {
		int prev = 1;
		for (int i = 2; i <= n; i++) {
			if (a[i] != a[prev]) {
				sons[1].push_back({nodeNums+1, a[prev], prev, i-prev});
				buildtree(nodeNums+1, prev, i-1, 0);
				nodeNums++;
				prev = i;
			}
		}
		sons[1].push_back({nodeNums+1, a[prev], prev, n-prev+1});
		buildtree(nodeNums+1, prev, n, 0);
		nodeNums++;
	} else {
		for (int i = left; i <= right; i++) {
			sons[root].push_back({++nodeNums, a[left], i, 1});
		}
	}
}
void work() {
	for (int i = 0; i < sons[1].size(); i++) {
		printf("%d ", sons[sons[1][i].idx][0].ai);
		sons[sons[1][i].idx].erase(sons[sons[1][i].idx].begin());
		if (sons[sons[1][i].idx].size() == 0) {
			sons[1].erase(sons[1].begin()+i);
			i--;
		}
	}
	// merge
	for (int i = 1; i < sons[1].size(); i++) {
		if (sons[1][i].val != sons[1][i-1].val) continue;
		int id = sons[1][i].idx;
		for (int j = 0; j < sons[id].size(); j++) {
			sons[sons[1][i-1].idx].push_back(sons[id][j]);
		}
		sons[1].erase(sons[1].begin()+i);
		i--;
	}
	printf("\n");
}
int main()
{
	freopen("fruit.in", "r", stdin);
	freopen("fruit.out", "w", stdout);
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	buildtree(1, 1, n, 1);
	while (sons[1].size()) {
		work();
	}
	return 0;
}

洛谷自测:342 = 100 + 72 + 100 + 70

计蒜客自测:342 = 100 + 52 + 100 + 90

目前看上去 1= 稳了。


UPD 2 (2021/10/30 22:38):

CCF 官方:100 + 52 + 100 + 70 = 322