Educational Codeforces Round 111 选做
施工中
A. Find The Array
直接 \(1+3+5+\dots\) 找到第一个比其大的数,显然可以通过调整使其与之相等。
#include<bits/stdc++.h>
int main()
{
int T; scanf("%d",&T);
while(T--)
{
int s,x=0;
scanf("%d",&s);
for(int i=1,sum=0;sum<s;sum+=i,i+=2,++x);
printf("%d\n",x);
}
}
B. Maximum Cost Deletion
\(a\) 不用管直接乘 \(n\) 即可;如果 \(b>0\) 则需删除次数最大,一个一个删即可;\(b<0\) 可先把连续的 \(0/1\) 删掉最后一把删除剩余的 \(1/0\),次数为 \(\lfloor\frac{x}{2}\rfloor+1\)(\(x\) 为连续段个数)。
#include<bits/stdc++.h>
char s[105];
int main()
{
int T; scanf("%d",&T);
while(T--)
{
int n,a,b;
scanf("%d%d%d%s",&n,&a,&b,s+1);
if(b>0)
{
printf("%d\n",(a+b)*n);
continue;
}
int cnt=1;
for(int i=2;i<=n;++i) if(s[i]!=s[i-1]) ++cnt;
printf("%d\n",a*n+b*(cnt/2+1));
}
}
C. Manhattan Subarrays
(一开始把题目看错了,以为是子序列QAQ)
显然题中 good 子段即为不含长度 \(\ge 3\) 的单调不增/不减子序列,画图易得这样的子段长度不超过 \(4\),直接暴力即可。
#include<bits/stdc++.h>
inline int gi()
{
char c=getchar(); int x=0;
for(;c<'0'||c>'9';c=getchar());
for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+c-'0';
return x;
}
const int N=2e5+5;
int n,a[N];
bool check(int l, int r)
{
for(int i=l;i<=r;++i)
for(int j=i+1;j<=r;++j)
for(int k=j+1;k<=r;++k)
{
if(a[i]<=a[j]&&a[j]<=a[k]) return 0;
if(a[i]>=a[j]&&a[j]>=a[k]) return 0;
}
return 1;
}
int main()
{
int T=gi();
while(T--)
{
n=gi();
for(int i=1;i<=n;++i) a[i]=gi();
long long ans=0;
for(int i=1;i<=n;++i)
for(int j=i;j<=n&&j<=i+3;++j)
ans+=check(i,j);
printf("%lld\n",ans);
}
}
D. Excellent Arrays
题意
求有多少个数列 \(\{a_n\}\) 满足 \(l\le a_i\le r\),\(a_i\neq i\),且在所有满足上述条件的数列中 \(a_i+a_j=i+j\) 的数对 \((i,j)(1\le i\lt j\le n)\) 的个数最多。