2026.4.11 - 蓝桥杯山东省赛(软件类C/C++研究生组) - 游记

赛前

省赛不在本校打,而在隔壁的青岛理工大学黄岛校区打,还是很惊喜的,第一次发现省赛也能出去玩。

赛前做了一下去年的省赛题,难度一般,比B组简单一些,还是比较有信心的。

赛时

比赛那天早上七点半就起了床,还处于朦胧的状态就打车去青岛理工大学。

进了考场,突然有了很久不曾出现的紧张的感觉,或许是太久不碰线下赛了,所有人一起敲击键盘的声音让我感受到很大的压力。但在短暂的调整之后我还是适应了节奏。

下面是对于赛题的一些回忆。

A:魔法矩阵能量值(模拟)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
void solve() {
cout << "138966";
};

signed main(){
IOS
int t = 1;
cin >> t;
while(t --) {
solve();
}
return 0;
}

签到题,答案是138966.

B:量子 2048(?)

想了一会,并不会。赛前VP了25年研究生组省赛真题,也是第二个填空不会,遂放弃。

C:2026的出现次数(动态规划)

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
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
void solve() {
string s;
cin >> s;
int n = s.size();
s = '#' + s;
vector<int> dp(n + 1);
for(int i = 1 ; i <= n ; i ++) {
dp[i] = max(dp[i] , dp[i - 1]);
if(s[i] == '6') {
if(i < 4) continue;
if(s[i - 1] == '2' && s[i - 2] == '0' && s[i - 3] == '2') {
dp[i] = max(dp[i] , dp[i - 4] + 1);
}
}
if(s[i] == '2') {
if(i < 6) continue;
if(s[i - 1] == '0' && s[i - 2] == '2' && s[i - 3] == '2' && s[i - 4] == '0' && s[i - 5] == '2') {
dp[i] = max(dp[i] , dp[i - 6] + 1);
}
}
}
cout << dp[n];
};

signed main(){
IOS
int t = 1;
// cin >> t;
while(t --) {
solve();
}
return 0;
}

赛后和同学交流了一下,贪心算法就能写完,但是我当时没有证明出贪心的正确性,所以想了一个动态规划的做法。

但是可惜赛时状态更新的顺序写的有一点小问题,大概会挂1 - 2分,无伤大雅。

D:评测漏洞(简单计数)

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
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
void solve() {
int n;cin >> n;
vector<int> arr(n + 1);
for(int i = 1 ; i <= n ; i ++) cin >> arr[i];
map<int , int> cnt;
int ans = 0;
for(int i = 1 ; i <= n ; i ++) {
int x = - arr[i];
ans += cnt[x];
x = - (arr[i] - 1);
ans += cnt[x];
cnt[arr[i]] ++;
}
cout << ans ;
};

signed main(){
IOS
int t = 1;
// cin >> t;
while(t --) {
solve();
}
return 0;
}

记一下数即可,也是送分题

E:人类识别审查(差分数组)

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
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
void solve() {
int n;cin >> n;
vector<int> c(n + 2);
for(int i = 1 ; i <= n ; i ++) {
int l , r;
cin >> l >> r;
c[l] += 1;
c[r + 1] -= 1;
}
for(int i = 1 ; i <= n ; i ++) {
c[i] += c[i - 1];
}
int ans = -1;
for(int i = n ; i >= 0 ; i --) {
if(c[i] == i) {
ans = i;
break;
}
}
cout << ans ;
};

signed main(){
IOS
int t = 1;
// cin >> t;
while(t --) {
solve();
}
return 0;
}

差分数组模版题,注意差分数组不要开小了导致越界即可。

F:基态坍缩(博弈)

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
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
void solve() {
int n;cin >> n;
vector<int> arr(n + 1);
for(int i = 1 ; i <= n ; i ++) cin >> arr[i];
//L赢不赢
auto dfs = [&](auto &&self , int x) -> bool {
if(x == 0) return 0;
if(x == 1) return 1;
if(arr[x] == 1) {
if(arr[x - 1] != 1) {
return 0;
} else {
return self(self , x - 2);
}
} else {
return 1;
}
};
int win = dfs(dfs , n);
if(win == 1) {
cout << "L\n";
} else {
cout << "Q\n";
}
};

signed main(){
IOS
int t = 1;
cin >> t;
while(t --) {
solve();
}
return 0;
}

场上打了个表,找到了一点规律,可以线性的做完。

G:综合应变指标(?)

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
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
void solve() {
int n;cin >> n;
vector<int> arr(n + 1) , pre(n + 1);
for(int i = 1 ; i <= n ; i ++) {
cin >> arr[i];
pre[i] = pre[i - 1] + arr[i];
}
int ans = 0;
for(int i = 1 ; i <= n - 2 ; i ++) {
for(int j = i + 1 ; j <= n - 2 ; j ++) {
for(int k = j + 1 ; k <= n - 1 ; k ++) {
int sum1 = abs(pre[i] - pre[0]);
int sum2 = abs(pre[j] - pre[i]);
int sum3 = abs(pre[k] - pre[j]);
int sum4 = abs(pre[n] - pre[k]);
ans = max(ans , sum1 + sum2 + sum3 + sum4);
}
}
}
cout << ans ;
};

signed main(){
IOS
int t = 1;
// cin >> t;
while(t --) {
solve();
}
return 0;
}

60%还是很好想的,想了一会100%,完全想不出来,摸了暴力就跑路了。

H:通信链路(?)

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;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;

struct DSU {
vector<int> fa , siz;

DSU() {}
DSU(int n) {
init(n);
}

void init(int n) {
fa.resize(n);
iota(fa.begin(), fa.end(), 0);
siz.assign(n, 1);
}

int find(int x) {
while (x != fa[x]) {
x = fa[x] = fa[fa[x]];
}
return x;
}

bool same(int x, int y) {
return find(x) == find(y);
}

bool merge(int x, int y) {
x = find(x);
y = find(y);
if (x == y) {
return false;
}
siz[x] += siz[y];
fa[y] = x;
return true;
}

int size(int x) {
return siz[find(x)];
}
};

void solve() {
int n , m;
cin >> n >> m;
DSU dsu(n + 1);
for(int i = 1 ; i <= m ; i ++) {
int u , v , w;
cin >> u >> v >> w;
dsu.merge(u , v);
}
vector<int> ans(10);
for(int i = 1 ; i <= n ; i ++) {
if(dsu.find(i) == i) {
int cnt = dsu.siz[i];
ans[0] += cnt * (cnt - 1);
}
}
for(int i = 0 ; i < 10 ; i ++) {
cout << ans[i] << "\n";
}
};

signed main(){
IOS
int t = 1;
// cin >> t;
while(t --) {
solve();
}
return 0;
}

30%还是很好想的,写完30%的时候还剩半小时,因为有点急事所以就提前离场了,没有走的话或许可以尝试一下50%和70%。

赛后

去洛谷自测了一下下,上面的代码就是根据我赛时的记忆复现的。

题号 A B C D E F G H 总计
场上估分 5/5 0/5 10/10 10/10 15/15 15/15 12/20 6/20 73/100
洛谷自测 5/5 0/5 9/10 10/10 15/15 15/15 12/20 6/20 72/100

总结一下,青岛理工大学真的是超级棒!

首先就是景色很美呀,青岛的四月,五颜六色的🌸都开了,看着赏心悦目的。

其次就是志愿者小哥哥小姐姐们真的很热心,也很有耐心。

更重要的是这里的机房真的很无敌,键盘回弹速度很快,一点不输我自己的机械键盘,电脑编译运行时间也很快,完全不是老年机,让我的效率大大提升,体验感拉满。

然后说一下题目,研究生组打的人明显就很少很少,研究生组的初赛题目和AB组比起来也是偏简单,如果全力发挥能拿到80分左右的分数,这在AB组还是很困难的。今年貌似反作弊机制加强了,再一次希望🏀杯蒸蒸日上。

现场随拍
现场随拍

2026.4.11 - 蓝桥杯山东省赛(软件类C/C++研究生组) - 游记
http://example.com/2026/04/12/2026-4-11-蓝桥杯软件类C-C-研究生组山东省赛游记/
作者
John Doe
发布于
2026年4月12日
许可协议