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) i⋅j−k⋅(ai∣aj) over all pairs ( i , j ) (i, j) (i,j) of integers with 1 ≤ i < j ≤ n 1 \\le i < j \\le n 1≤i<j≤n. 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 1≤t≤10000) — 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 2≤n≤105) and k k k ( 1 ≤ k ≤ min ( n , 100 ) 1 \\le k \\le \\min(n, 100) 1≤k≤min(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 0≤ai≤n).
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 3⋅105.
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) i⋅j−k⋅(ai∣aj).
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)=i⋅j−k⋅(ai∣aj).
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]) i∗j−k∗(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 (n≥a[i])。
那么 k k k是什么? k k k就是要减去的那个或结果的系数。
如果不需要减去这么一个 k k k,那么 i i i和 j j j肯定选最大的两个 n n n和 n − 1 n-1 n−1。
这个“讨厌”的 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 n−200。也就是说前面数据再多,都是没有意义的。我们只需要考虑后 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×105∗min(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-题解