赛前
省赛不在本校打,而在隔壁的青岛理工大学打,还是很惊喜的,第一次发现省赛也能出去玩。
赛前做了一下去年的省赛题,难度一般,比B组简单一些,还是比较有信心的。
赛时
比赛那天早上七点半就起了床,还处于朦胧的状态就打车去青岛理工大学。
进了考场,突然有了很久不曾出现的紧张的感觉,或许是太久不碰线下赛了,所有人一起敲击键盘的声音让我感受到很大的压力。但在短暂的调整之后我还是适应了节奏。
A(模拟)
cpp
#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;
/*
性质1:
---------------------------
性质2:
---------------------------
*/
void solve() {
cout << "138966";
};
signed main(){
IOS
int t = 1;
cin >> t;
while(t --) {
solve();
}
return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);
签到题,答案是138966.
B(?)
想了一会,并不会。赛前VP了25年研究生组省赛真题,也是第二个填空不会,遂放弃。
C(动态规划)
cpp
#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;
/*
性质1:
---------------------------
性质2:
---------------------------
*/
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;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);
好像贪心就能写完,但是我当时没有证明出贪心的正确性,所以想了一个动态规划的做法,语句的顺序写的有一点小问题,大概会挂1 - 2分。
D(简单计数)
cpp
#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;
/*
性质1:
---------------------------
性质2:
---------------------------
*/
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;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);
记一下数即可,也是送分题
E(差分数组)
cpp
#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;
/*
性质1:
---------------------------
性质2:
---------------------------
*/
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;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);
差分数组模版题,注意差分数组不要开小了导致越界即可。
F(博弈)
cpp
#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;
/*
性质1:
---------------------------
性质2:
---------------------------
*/
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;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);
场上打了个表,找到了一点规律,可以线性的做完。
G(?)
cpp
#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;
/*
性质1:
---------------------------
性质2:
---------------------------
*/
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;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);
60%还是很好想的,想了一会100%,完全想不出来,摸了暴力就跑路了。
H(?)
cpp
#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;
/*
性质1:
---------------------------
性质2:
---------------------------
*/
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;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);
30%还是很好想的,写完30%的时候还剩半小时,因为有点急事所以就提前离场了,没有走的话或许可以尝试一下50%和70%。
赛后
去洛谷自测了一下下,上面的代码就是根据我赛时的记忆复现的。
| 题号 | A | B | C | D | E | F | G | H | 总计 |
|---|---|---|---|---|---|---|---|---|---|
| 场上估分 | 5 | 0 | 10 | 10 | 15 | 15 | 12 | 6 | 73 |
| 洛谷自测 | 5 | 0 | 9 | 10 | 15 | 15 | 12 | 6 | 72 |
总结一下,青岛理工大学真的是超级棒!
首先就是景色很美呀,青岛的四月,五颜六色的🌸都开了,看着赏心悦目的。
其次就是志愿者小哥哥小姐姐们真的很热心,也很有耐心。
更重要的是这里的机房真的很无敌,键盘回弹速度很快,一点不输我自己的机械键盘,电脑编译运行时间也很快,完全不是老年机,让我的效率大大提升,体验感拉满。
然后说一下题目,研究生组打的人明显就很少很少,研究生组的初赛题目和AB组比起来也是偏简单,如果全力发挥能拿到80分左右的分数,这在AB组还是很困难的。今年貌似反作弊机制加强了,再一次希望🏀杯蒸蒸日上。