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),1l<rn的最大值。

解题思路:

通过观察样例,我们可以大胆地猜测最优解的区间长度不会超过 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+1al+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+1al×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+1al×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) 1i<jn,i×jk×(aiaj)的最大值,其中 ∣ | 表示位运算中的或运算。

数据范围: 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 1n105,1kmin(n,100),0ain.

解题思路:

由于 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×jk×(aiaj)这个结构,我们发现对于前半部分的 i × j i\\times j i×j,我们一定是会在 ( n − 1 , n ) (n-1,n) (n1,n)这一对取到最大值,又因为 0 ≤ a n − 1 ∣ a n ≤ 2 × n 0\\le a_{n-1}|a_n\\le 2\\times n 0an1an2×n ( n − 1 , n ) (n-1,n) (n1,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(n1,n)=(n1)×nk×2×n=n22×k×nn

那么我们考虑对于任何一对 ( 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-题解

Codeforces Round #735 (Div. 2)-B. Cobb-题解

Codeforces Round #735 (Div. 2)-A. Cherry-题解