训练情况
赛后反思
被英语读题背刺了,原来 C 题里面的 an element 不是 exacly one element 的意思,是 at least one element,读错题被一直硬控,这题没做出来的死因是高中组合数学。
A题
我们手玩样例可以发现 101 的情况必定不合法,abcd,第一个1说明abc相等,第三个1说明bcd相等,那么abcd就相等,与中间的 0 不相等矛盾,所以判断这个即可
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int n; cin>>n;vector<int> a(n);for(int i = 1;i<=n-2;i++) cin>>a[i];bool flag = true;for(int i = 3;i<=n-2;i++){if(a[i-2] == 1 && a[i-1] == 0 && a[i] == 1) flag = false;}if(flag) cout<<"YES"<<endl;else cout<<"NO"<<endl;
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}
B题
有个观察小性质,我们发现对于联通块大小等于一的同种颜色,显然操作 \(1\) 次即可,联通块大小大于一的同种颜色,操作 \(2\) 次必然能全部改掉,所以我们只要根据联通块的大小分类讨论求答案即可,最后把贡献最大的去掉,剩下的和就是答案了
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int n,m; cin>>n>>m;vector<vector<int>> a(n + 1,vector<int>(m + 1));vector<int> v(n*m+1);for(int i = 1;i<=n;i++){for(int j = 1;j<=m;j++){cin>>a[i][j];v[a[i][j]] = 1;}}for(int i = 1;i<=n;i++){for(int j = 1;j<m;j++){if(a[i][j] == a[i][j+1]) v[a[i][j]] = 2;}}for(int i = 1;i<n;i++){for(int j = 1;j<=m;j++){if(a[i][j] == a[i+1][j]) v[a[i][j]] = 2;}}sort(v.begin() + 1,v.end());int ans = 0;for(int i = 1;i<=n*m-1;i++){ans += v[i];}cout<<ans<<endl;
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}