Codeforces Round #735 (Div. 2) 题解(A-D)
Posted 陌默z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #735 (Div. 2) 题解(A-D)相关的知识,希望对你有一定的参考价值。
Codeforces Round #735 (Div. 2) 题解(A-D)
A. Cherry
题目大意:
有一个长度为 n n n的整数数组 a a a。找出 m a x ( a l , a l + 1 , . . . , a r ) × m i n ( a l , a l + 1 , . . . a r ) , 1 ≤ l < r ≤ n max(a_l,a_{l+1},...,a_r)\\times min(a_l,a_{l+1},...a_{r}),1\\le l <r \\le n max(al,al+1,...,ar)×min(al,al+1,...ar),1≤l<r≤n的最大值。
解题思路:
通过观察样例,我们可以大胆地猜测最优解的区间长度不会超过 2 2 2,所以我们只用遍历一遍数组即可,时间复杂度 O ( n ) O(n) O(n)。
现在简单论证一下为什么这种做法是正确的:
如果存在一个区间 [ l , l + 2 ] [l,l+2] [l,l+2]是优于 [ l , l + 1 ] [l,l+1] [l,l+1]和 [ l + 1 , l + 2 ] [l+1,l+2] [l+1,l+2]的,那么区间 [ l , l + 1 ] [l,l+1] [l,l+1]的最大值和最小值一定是 a l a_l al和 a l + 2 a_{l+2} al+2。
如果 a l a_l al是最大值的话,因为 a l + 1 ≥ a l + 2 a_{l+1}\\ge a_{l+2} al+1≥al+2,那么一定存在 a l × a l + 1 ≥ a l × a l + 2 a_l\\times a_{l+1}\\ge a_l\\times a_{l+2} al×al+1≥al×al+2。
同理,如果 a l + 2 a_{l+2} al+2是最大值的话,那么一定存在 a l + 2 × a l + 1 ≥ a l × a l + 2 a_{l+2}\\times a_{l+1}\\ge a_l\\times a_{l+2} al+2×al+1≥al×al+2。
所以对于区间长度大于 2 2 2的区间,我们一定能找出不弱于当前区间的区间长度为 2 2 2的区间。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int a[N];
int n;
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
LL res=0;
for(int i=1;i<n;i++){
res=max(res,(LL)a[i]*a[i+1]);
}
printf("%lld\\n",res);
}
return 0;
}
B. Cobb
题目大意:
对于一个长度为 n n n的整数数组 a a a。找出 ∀ 1 ≤ i < j ≤ n , i × j − k × ( a i ∣ a j ) \\forall \\;1\\le i<j\\le n,i\\times j-k\\times(a_i|a_j) ∀1≤i<j≤n,i×j−k×(ai∣aj)的最大值,其中 ∣ | ∣表示位运算中的或运算。
数据范围: 1 ≤ n ≤ 1 0 5 , 1 ≤ k ≤ min ( n , 100 ) , 0 ≤ a i ≤ n 1\\le n\\le10^5,1\\le k \\le \\min(n,100),0\\le a_i\\le n 1≤n≤105,1≤k≤min(n,100),0≤ai≤n.
解题思路:
由于 n n n数据范围的限制,如果本题用 O ( n 2 ) O(n^2) O(n2)的暴力做法是会 T L E TLE TLE的。
通过观察 i × j − k × ( a i ∣ a j ) i\\times j-k\\times(a_i|a_j) i×j−k×(ai∣aj)这个结构,我们发现对于前半部分的 i × j i\\times j i×j,我们一定是会在 ( n − 1 , n ) (n-1,n) (n−1,n)这一对取到最大值,又因为 0 ≤ a n − 1 ∣ a n ≤ 2 × n 0\\le a_{n-1}|a_n\\le 2\\times n 0≤an−1∣an≤2×n, ( n − 1 , n ) (n-1,n) (n−1,n)这一对的最小值是 min ( n − 1 , n ) = ( n − 1 ) × n − k × 2 × n = n 2 − 2 × k × n − n \\min(n-1,n)=(n-1)\\times n-k\\times2\\times n=n^2-2\\times k\\times n-n min(n−1,n)=(n−1)×n−k×2×n=n2−2×k×n−n。
那么我们考虑对于任何一对 ( i , j ) (i,j) (i,j),其中 i < j i<j i<j。对于包含 i i i的某对而言,能取得的最大值就是 j = n j=n j=Codeforces Round #735 (Div. 2)-C. Mikasa-题解
Codeforces Round #735 (Div. 2)-B. Cobb-题解
Codeforces Round #735 (Div. 2)-A. Cherry-题解
Codeforces Round #735 (Div. 2)-C. Mikasa-题解