A. Find The Array
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N =5e5+10,mod=998244353;
void solve()
{
int n;
cin>>n;
int ans=sqrt(n);
if(ans*ans<n)
ans++;
cout<<ans<<"\n";
return ;
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
B. Maximum Cost Deletion
题意:给你一个01字符串,我们每次可以删除相连的且内部每个字符都相等的子串.每次删除的长度为l,那么对于答案的贡献就是a*l+b,a和b都是需要进行输入的.问最大贡献是多少.
思路:当n<0时,我们一个字符一个字符的取最大,当b<0时我们就要让加上的b的个数尽量的少,也就是取的次数尽量的少,我们就要么全部删除1,要么全部删除0,最后剩下的字符串一次删.呢么对于这些情况取max即可.
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N =5e5+10,mod=998244353;
void solve()
{
int n,a,b,ans;
string s;
cin>>n>>a>>b>>s;
int cnt=1;
for(int i=1;i<s.size();i++)
{
if(s[i]!=s[i-1])
cnt++;
}
ans=max(n*a+b*(cnt/2+1),(a+b)*n);
cout<<ans<<"\n";
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
C. Manhattan Subarrays
题目读错了,子串读成子序列...
题意:给你一个数组,定义某种计算:d(p,q)=|xp−xq|+|yp−yq|.定义坏东西:d(p,r)=d(p,q)+d(q,r).求一个数组中有多少个子数组,保证任取三个元素都是好东西.素组元素为(ai,i);
我们直接列出式子进行变形.设取i,j,k三个位置的数(i<j<k)
在进行分析,当长度len==1,len==2时合法
len==3和len==4时进行判断,当n>=5了就肯定合法(总能枚举上升的)那么对于3,和4的情况枚举即可
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N =5e5+10,mod=998244353;
int a[200005];
int check(int x,int y,int z)
{
if(x<=y&&y<=z)
return 1;
else if(x>=y&&y>=z)
return 1;
return 0;
}
void solve()
{
int n,ans;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
ans=2*n-1;
if(n>=3)
{
for(int i=1;i<=n-2;i++)
if(check(a[i],a[i+1],a[i+2])==0)
ans++;
}
if(n>=4)
{
for(int i=1;i<=n-3;i++)
if(check(a[i],a[i+1],a[i+2])||check(a[i],a[i+1],a[i+3])||check(a[i],a[i+2],a[i+3])||check(a[i+1],a[i+2],a[i+3]));
else
ans++;
}
cout<<ans<<"\n";
return ;
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
D才过了300人,直接skip