题意:给定一个01字符串,每次可以将它后移一位,然后放到下一行,问1所形成的矩形的最大面积是多少
思路:我们计算一下最大的连续的1的长度,由于类似于圆,我们直接把头尾相连开个2倍的,然后把这个分解,比如是7,那么我们计算7 1,6 2,5 3,4 4的最大值即可
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
string s;
cin>>s;
int cnt=0;
int ans=0;
// if(s.size()>2)
s=s+s;
for (int i = 0; i <s.size() ; ++i) {
if(s[i]=='1'){
cnt++;
}
else{
ans=max(ans,cnt);
cnt=0;
}
}
ans=max(ans,cnt);
int res=0;
if(ans==s.size()){
ans/=2;
res=ans*ans;
}
for (int i = 0; i <=ans/2 ; ++i) {
res=max(res,(ans-i)*(1+i));
}
cout<<res<<' '<<'\n';
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while (t--){
solve();
}
}
题意:给定一个区间,这个区间的MEX值是k,我们能够执行一个操作,即把l到r的所有数字变成一个数字x,问这个操作能否得到MEX为k+1
思路:我们用set求出原数列的MEX值,然后我们求出MEX+1的左区间和右区间,如果有的话,我们把这个区间涂成MEX,然后再求MEX是否等于MEX+1即可,如果没有刚开始没有找到+1,那么我们可以对任意一个数多余的数涂成MEX,如果有多余的数,就是YES,否则 no
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;
cin>>n;
set<int>st;
set<int>prest;
for (int i = 0; i <=n+1 ; ++i) {
st.insert(i);
}
prest=st;
vector<int>a(n);
for (int i = 0; i <n ; ++i) {
cin>>a[i];
st.erase(a[i]);
}
int mex=*st.begin();
int l=1e9,r=0;
for (int i = 0; i <n ; ++i) {
if(a[i]==mex+1){
l=min(l,i);
r=max(r,i);
}
}
for (int i = l; i <=r ; ++i) {
a[i]=mex;
}
if(l==1e9){
if(n==mex){
cout<<"NO\n";
}
else{
cout<<"YES\n";
}
return;
}
for (int i = 0; i < n; ++i) {
prest.erase(a[i]);
}
int mex1=*prest.begin();
if(mex1==mex+1){
cout<<"YES\n";
}
else{
cout<<"NO\n";
}
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while (t--){
solve();
}
}