A 题意: 计算整个区间内最大的值,满足一个区间的max*区间的min
分析:
考虑到我们固定一个数,那么左右移动的时候可能随着长度增加,区间min会改变(我们先假设这个固定的数就是该区间的max)那么我们只需要计算相邻两个数的乘积即可。
ll n;
read(n);
ll ans=0;
for(int i=1; i<=n; i++)
{
read(a[i]);
if(i>=2)
{
ans=max(ans,a[i]*a[i-1]);
}
}
printf("%lld\n",ans);
B题意: 如图计算那个式子的最大值。
分析
K只有不到100 ,而且ai的范围也不大。因此i*j 越大,K的影响就越小,因此只需要枚举后面的一部分数即可。
for(int i = 1;i <= n;i++) read(a[i]);
ll res = -0x3f3f3f3f3f3f3f3f;
for(int i = max(1,n - 200);i <= n - 1;i++)
for(int j = i + 1;j <= n;j++)
res = max(res,1ll * i * j - 1ll * k * (a[i] | a[j]));
直接枚举n ,m 的后i 位,统计答案取min即可
构造一个长度为N的字符串,任何一个子串出现奇数次。
考虑到这么一个序列 x*(n)+y+x*(n-1) 显然x*(n) 相当于在n-1的基础上多加了一个字符,那么多产生一个长度为n的子串。那么本来x*(n)中的x*(n-1) 就会因为多加入一个字符,每个子串多增加奇数个。因此可以达成任意子串出现奇数次。
while(t--){
ll n;
read(n);
for(int i=1;i<=n/2;i++)
printf("a");
printf("b");
for(int i=1;i<=n/2-1;i++)
printf("a");
if(n&1 && n>1)printf("c");
printf("\n");
}
}