Practice.
A. Indirect Sort
题意
给定一个排列
选择三个下标
,满足 ; 若
,将 替换为 ,否则将 和 交换。
输出是否可以将排列变为一个不递减序列。
思路
显然,当第一位不为
相反地,当第一位为
时间复杂度:
对应AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10, inf = 0x3f3f3f3f, mod = 998244353;
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while(t --){
int n;
cin >> n;
int a, tmp;
cin >> a;
for(int i=1;i<n;i++) cin >> tmp;
cout << (a == 1 ? "YES\n" : "No\n");
}
}
怎么会是呢,怎么想了那么久呢?
B. Maximum Substring
题意
给定一个二进制字符串,对于它的连续子串,统计
,如果 并且 ; ,如果 并且 ; ,如果 并且 。
输出所有子串中最大的代价。
思路
显然,若我们想让代价最大,那么我们希望子串中
所以,我们不妨找出所有连续相等的子串,然后计算个数的平方,记录该条件的最大值。
而假设不满足上述条件,那么我们就希望
时间复杂度:
对应AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10, inf = 0x3f3f3f3f, mod = 998244353;
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while(t --){
int n;
cin >> n;
string s;
cin >> s;
int num = 0;
for(char e : s)
if(e == '1') num ++;
int cnt = 0, pre = 0;
for(int i=0;i<n;i++){
if(s[i] == s[pre]) continue;
else{
cnt = max(cnt, i - pre);
pre = i;
}
}
cnt = max(cnt, n - pre);
cout << max(cnt * cnt, num * (n - num)) << '\n';
}
}
简单思维题
C. Complementary XOR
题意
给定两个长度相等的二进制字符串
思路
显然,若
其次,若
那么,我们来考虑
不难发现,若我们遍历到了
当然,右边界
按照上述输出,我们将会得到最多
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
const int N = 2e5 + 10;
int cnt[N];
signed main(){
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t, n;
cin >> t;
vector<pii> ans;
while(t --){
ans.clear();
cin >> n;
for(int i=0;i<n;i++) cnt[i] = 0;
string a, b;
cin >> a >> b;
bool ok = true;
for(int i=0;i<n;i++){
if(a[i] != ('1' - b[i] + '0')){
ok = false;
break;
}
}
if(a != b && !ok){
cout << "NO\n";
}else{
cout << "YES\n";
if(a != b){
ans.emplace_back(1, n);
a = b;
}
for(int i=0;i<n;i++){
if(a[i] == '1'){
if(i == 0){
ans.emplace_back(1, n);
ans.emplace_back(2, n);
}else{
cnt[i] ++;
cnt[i - 1] ++;
}
}
}
for(int i=0;i<n;i++){
if(cnt[i] % 2 == 1) ans.emplace_back(1, i + 1);
}
cout << ans.size() << '\n';
for(auto x : ans) cout << x.first << ' ' << x.second << '\n';
}
}
}
构造题有时候想到就感觉很妙啊((
- 本文链接 https://floating-ocean.github.io/blog_old/posts/3739927720/
- 版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!