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

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #735 (Div. 2)-B. Cobb-题解相关的知识,希望对你有一定的参考价值。

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

传送门
Time Limit: 1 second
Memory Limit: 256 megabytes

Problem Description

You are given n n n integers a 1 , a 2 , … , a n a_1, a_2, \\ldots, a_n a1,a2,,an and an integer k k k. Find the maximum value of i ⋅ j − k ⋅ ( a i ∣ a j ) i \\cdot j - k \\cdot (a_i | a_j) ijk(aiaj) over all pairs ( i , j ) (i, j) (i,j) of integers with 1 ≤ i < j ≤ n 1 \\le i < j \\le n 1i<jn. Here, ∣ | is the bitwise OR operator.

Input

The first line contains a single integer t t t ( 1 ≤ t ≤ 10   000 1 \\le t \\le 10\\,000 1t10000)  — the number of test cases.

The first line of each test case contains two integers n n n ( 2 ≤ n ≤ 1 0 5 2 \\le n \\le 10^5 2n105) and k k k ( 1 ≤ k ≤ min ⁡ ( n , 100 ) 1 \\le k \\le \\min(n, 100) 1kmin(n,100)).

The second line of each test case contains n n n integers a 1 , a 2 , … , a n a_1, a_2, \\ldots, a_n a1,a2,,an ( 0 ≤ a i ≤ n 0 \\le a_i \\le n 0ain).

It is guaranteed that the sum of n n n over all test cases doesn’t exceed 3 ⋅ 1 0 5 3 \\cdot 10^5 3105.

Output

For each test case, print a single integer  — the maximum possible value of i ⋅ j − k ⋅ ( a i ∣ a j ) i \\cdot j - k \\cdot (a_i | a_j) ijk(aiaj).

Sample Input

4
3 3
1 1 3
2 2
1 2
4 3
0 1 2 3
6 6
3 2 0 0 5 6

Sample Onput

-1
-4
3
12

Note

Let f ( i , j ) = i ⋅ j − k ⋅ ( a i ∣ a j ) f(i, j) = i \\cdot j - k \\cdot (a_i | a_j) f(i,j)=ijk(aiaj).

In the first test case,

So the maximum is f ( 1 , 2 ) = − 1 f(1, 2) = -1 f(1,2)=1.

In the fourth test case, the maximum is f ( 3 , 4 ) = 12 f(3, 4) = 12 f(3,4)=12.


题目大意

给你一个数组 a a a和一个正整数 k k k,让你从中选取不同的两个数 a [ i ] a[i] a[i] a [ j ] a[j] a[j],计算 i ∗ j − k ∗ ( a [ i ] ∥ a [ j ] ) i*j-k*(a[i]\\|a[j]) ijk(a[i]a[j])的最大值。

解题思路

暴力解题需要复杂度 O ( n 2 ) O(n^2) O(n2)会超时,所以需要进行优化。

有没有发现这一题的 k k k很特殊, k k k不会超过 100 100 100也不会超过 n   ( n ≥ a [ i ] ) n\\ (n\\geq a[i]) n (na[i])

那么 k k k是什么? k k k就是要减去的那个或结果的系数。

如果不需要减去这么一个 k k k,那么 i i i j j j肯定选最大的两个 n n n n − 1 n-1 n1

这个“讨厌”的 k k k让我们减去了多少呢?最多减去 100 100 100倍的或结果。而 a [ i ] , a [ j ] ≤ n a[i],a[j]\\leq n a[i],a[j]n a [ i ] ∣ a [ j ] < 2 × n a[i]|a[j]<2\\times n a[i]a[j]<2×n,所以由 k k k造成的影响最多不超过 200 × n 200\\times n 200×n

如果 n n n特别大,那么选择后面的元素的话 i i i j j j就会非常大,大约是 n × n n\\times n n×n,与 k k k造成的影响 200 × n 200\\times n 200×n相差一个 n n n 200 200 200

所以 i i i j j j不会小于 n − 200 n-200 n200。也就是说前面数据再多,都是没有意义的。我们只需要考虑后 200 200 200个数据就够了。

分析一下复杂度

每组测试样例复杂度为 O ( m i n ( n 2 , 20 0 2 ) ) O(min(n^2, 200^2)) O(min(n2,2002))
每组数据有 n n n个的话最多有 3 × 1 0 5 / n 3\\times10^5/n 3×105/n组数据,
粗略估算复杂度就是 O ( 3 × 1 0 5 ∗ m i n ( n , 200 ) ) ≤ O ( 6 × 1 0 6 ) O(3\\times10^5*min(n, 200))\\leq O(6\\times10^6) O(3×105min(n,200))O(6×106)

代码实现就不困难了。


AC代码

记得用 l o n g   l o n g long\\ long long long需要相乘的 i , j i,j i,j也要用 l o n g   l o n g long\\ long long long

#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << 以上是关于Codeforces Round #735 (Div. 2)-B. Cobb-题解的主要内容,如果未能解决你的问题,请参考以下文章

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-题解