A. Yura's New Name
分析
只有两个_的时候中间需要加^,注意的点,当_在首位时需要在_的左边加上^,其次特判"^"凑成^^即可。
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 100010,mod = 1e9+7;
int n,m;
void solve()
{
string s;
cin >> s;
int ans = 0;
if(s[0] == '^' && s.size() == 1)
{
cout << 1 << '\n';
return ;
}
for(int i = 0;i < s.size(); i++)
{
if(s[i] == '_')
{
if(i == 0) ans++;
if(i + 1 < s.size() && s[i+1] != '^') ans++;
else if(i + 1 == s.size()) ans++;
}
}
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt;
cin >> tt;
while(tt--)
{
solve();
}
return 0;
}
B. JoJo's Incredible Adventures
分析
通过画图,发现了一些特点,比如011110的表已在Note中解释,011110和111001其实一样的答案,只是表的顺序不一样就是将倒数第二行当了第一行,矩形的长最长是连续一的个数(求的时候看成环),我们求的是矩形的最大面积,设矩形最长的边为k我们可以知道矩形的面积可以是1*k,2*(k-1),3*(k-2)...,后来我就分情况猜测了下答案,当k==n是答案k*k,其余情况分k为奇偶,奇数答案(k+2)/2*(k+2)/2,k为偶数答案(k+2)/2*k/2,证明我不怎么会。
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 200010,mod = 1e9+7;
int n,m;
void solve()
{
string s;
cin >> s;
n = s.size();
s = s + s + s;
int len = 0;
for(int i = 0;i < s.size(); i++)
{
if(s[i] == '0') continue;
int j = i;
while(s[j] == '1' && j < s.size())
{
j++;
}
len = max(len,min(j - i,n));
i = j - 1;
}
ll ans = 0;
if(len == n) ans = 1ll * n * n;
else
{
if(len & 1) ans = 1ll * (len / 2 + 1) * (len / 2 + 1);
else ans = 1ll * len / 2 * (len / 2 + 1);
}
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt;
cin >> tt;
while(tt--)
{
solve();
}
return 0;
}
C. Constructive Problem
分析
假设当前mex值为cur,我可以对某一连续子区间全改为某一个值能不能是现在的mex值为cur+1。首先我们要求出cur,思考怎么能让mex变为cur+1,一定是将某些值变为cur,因为原先数组中不含cur,分情况讨论,如果当前数组含有cur+1,又因为是对连续子区间操作,所有其中的数都要修改,如果不含cur+1,那就看0~cur-1中有没有重复的数或者是大于cur+1的数,进行操作后需要对其验证的看0~cur是否都有,有即输出Yes,否则输出No。
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 200010,mod = 1e9+7;
int n,m;
int a[N];
void solve()
{
map<int,int> mp;
cin >> n;
for(int i = 1;i <= n; i++)
{
cin >> a[i];
mp[a[i]]++;
}
int cur;
for(int i = 0;i <= n; i++)
{
if(!mp[i])
{
cur = i;
break;
}
}
int cnt = 0;
if(mp[cur + 1])
{
for(int i = 1;i <= n; i++)
{
if(a[i] == cur + 1)
{
mp[cur] = 1;
int j = i;
while(mp[cur + 1])
{
mp[a[j]]--;
j++;
}
break;
}
}
}
else
{
int flag = 0;
for(int i = 1;i <= n; i++)
{
if(mp[a[i]] >= 2 || a[i] > cur) flag = 1;
}
if(flag) mp[cur] = 1;
}
for(int i = 0;i <= cur; i++)
{
if(!mp[i])
{
cout << "No" << '\n';
return ;
}
}
cout << "Yes" << '\n';
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(nullptr);
int tt;
cin >> tt;
while(tt--)
{
solve();
}
return 0;
}