[Offer收割]编程练习赛12 register

Ended

Participants:1323

Verdict:Accepted
Score:100 / 100
Submitted:2017-04-02 14:16:38

Lang:G++

Edit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
using namespace std;
unsigned msb(unsigned n) {
  unsigned mask = 1 << 31;
  while(mask && (mask & n == 0)) mask >>= 1;
  return mask;
}
void process() {
  int n;
  cin >> n;
  vector<int> v(n);
  for (int i = 0; i < n; ++i) cin >> v[i];
  sort(v.rbegin(), v.rend());
  long long ret = 0;
  int mask = 0;
  for (int i = 0; i < n - 1; ++i) {
    long long const c = v[i];
    
    if (c <= mask || (c * c * c <= ret)) break;
    long long r = 0;
    for (int j = i + 1; j < n; ++j) {
      long long c2 = v[j];
      if (c2 <= mask) break;
      int nmask = msb(c2 & c);
      mask = max(mask, nmask);
      r = max(r, c * c2 * (c & c2));
    }
    ret = max(r, ret);
  }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX