Codeforces Round #172 (Div. 2)---D. Maximum Xor Secondary(RMQ + 二分)
2015-04-03 14:17
579 查看
Bike loves looking for the second maximum element in the sequence. The second maximum element in the sequence of distinct numbers x1, x2, …, xk (k > 1) is such maximum element xj, that the following inequality holds: .
The lucky number of the sequence of distinct positive integers x1, x2, …, xk (k > 1) is the number that is equal to the bitwise excluding OR of the maximum element of the sequence and the second maximum element of the sequence.
You’ve got a sequence of distinct positive integers s1, s2, …, sn (n > 1). Let’s denote sequence sl, sl + 1, …, sr as s[l..r] (1 ≤ l < r ≤ n). Your task is to find the maximum number among all lucky numbers of sequences s[l..r].
Note that as all numbers in sequence s are distinct, all the given definitions make sence.
Input
The first line contains integer n (1 < n ≤ 105). The second line contains n distinct integers s1, s2, …, sn (1 ≤ si ≤ 109).
Output
Print a single integer — the maximum lucky number among all lucky numbers of sequences s[l..r].
Sample test(s)
Input
5
5 2 1 4 3
Output
7
Input
5
9 8 3 5 7
Output
15
Note
For the first sample you can choose s[4..5] = {4, 3} and its lucky number is (4 xor 3) = 7. You can also choose s[1..2].
For the second sample you must choose s[2..5] = {8, 3, 5, 7}.
先rmq预处理好最大值,然后枚举每一个数作为次大值的情况,二分往左往右分别找到第一个大于它的数,然后取一个最大值就行
The lucky number of the sequence of distinct positive integers x1, x2, …, xk (k > 1) is the number that is equal to the bitwise excluding OR of the maximum element of the sequence and the second maximum element of the sequence.
You’ve got a sequence of distinct positive integers s1, s2, …, sn (n > 1). Let’s denote sequence sl, sl + 1, …, sr as s[l..r] (1 ≤ l < r ≤ n). Your task is to find the maximum number among all lucky numbers of sequences s[l..r].
Note that as all numbers in sequence s are distinct, all the given definitions make sence.
Input
The first line contains integer n (1 < n ≤ 105). The second line contains n distinct integers s1, s2, …, sn (1 ≤ si ≤ 109).
Output
Print a single integer — the maximum lucky number among all lucky numbers of sequences s[l..r].
Sample test(s)
Input
5
5 2 1 4 3
Output
7
Input
5
9 8 3 5 7
Output
15
Note
For the first sample you can choose s[4..5] = {4, 3} and its lucky number is (4 xor 3) = 7. You can also choose s[1..2].
For the second sample you must choose s[2..5] = {8, 3, 5, 7}.
先rmq预处理好最大值,然后枚举每一个数作为次大值的情况,二分往左往右分别找到第一个大于它的数,然后取一个最大值就行
/************************************************************************* > File Name: CF-172-D.cpp > Author: ALex > Mail: zchao1995@gmail.com > Created Time: 2015年04月03日 星期五 13时48分52秒 ************************************************************************/ #include <functional> #include <algorithm> #include <iostream> #include <fstream> #include <cstring> #include <cstdio> #include <cmath> #include <cstdlib> #include <queue> #include <stack> #include <map> #include <bitset> #include <set> #include <vector> using namespace std; const double pi = acos(-1.0); const int inf = 0x3f3f3f3f; const double eps = 1e-15; typedef long long LL; typedef pair <int, int> PLL; const int N = 100100; LL dp [20]; int LOG ; LL arr ; void initLOG() { LOG[0] = -1; for (int i = 1; i <= 100000; ++i) { LOG[i] = LOG[i - 1]; LOG[i] += !(i & (i - 1)); } } void initRMQ(int n) { for (int i = 1; i <= n; ++i) { dp[i][0] = arr[i]; } for (int j = 1; j <= LOG ; ++j) { for (int i = 1; i + (1 << j) - 1 <= n; ++i) { dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]); } } } LL ST(int l, int r) { int k = LOG[r - l + 1]; return max(dp[l][k], dp[r - (1 << k) + 1][k]); } int main() { int n; while (~scanf("%d", &n)) { LL ans = 0; for (int i = 1; i <= n; ++i) { scanf("%I64d", &arr[i]); } initLOG(); initRMQ(n); for (int i = 1; i <= n; ++i) { int l = i + 1, r = n, mid; LL tmp = arr[i]; while (l <= r) { mid = (l + r) >> 1; LL maxs = ST(i + 1, mid); if (maxs >= arr[i]) { tmp = maxs; r = mid - 1; } else { l = mid + 1; } } ans = max(ans, tmp ^ arr[i]); l = 1; r = i - 1; tmp = arr[i]; while (l <= r) { mid = (l + r) >> 1; LL maxs = ST(mid, i - 1); if (maxs > arr[i]) { tmp = maxs; l = mid + 1; } else { r = mid - 1; } } ans = max(ans, tmp ^ arr[i]); } printf("%I64d\n", ans); } return 0; }
相关文章推荐
- Codeforces Round #172 (Div. 2) D. Maximum Xor Secondary 单调栈应用
- Codeforces Round #169 (Div. 2) D. Little Girl and Maximum XOR(贪心,中等)
- 【Codeforces Round 169 (Div 2) D】【简单数位贪心】Little Girl and Maximum XOR 区间选两数使得异或值尽可能大
- Codeforces Round #172 (Div. 2) B. Nearest Fraction 二分
- Codeforces Round #172 (Div. 2)总结
- Codeforces Round #124 (Div. 2) / C. Lexicographically Maximum Subsequence
- Codeforces Round #285 (Div.1 B & Div.2 D) Misha and Permutations Summation --二分+树状数组
- Codeforces Round #404 (Div. 2) -- C. Anton and Fairy Tale(二分)
- Codeforces Round #388 (Div. 2)D. Leaving Auction(二分+思维)
- Codeforces Round #259 (Div. 2) C. Little Pony and Expected Maximum
- Codeforces Round #377 (Div. 2) D. Exams 二分+贪心 or 纯贪心水过
- Codeforces Round #299 (Div. 1) A. Tavas and Karafs(二分)
- Codeforces Round #402 (Div. 2) D(简单)(二分)
- Codeforces Round #377 (Div. 2) D 二分
- 【Codeforces Round #172】Codeforces 280D k-Maximum Subsequence Sum
- Codeforces Round #172 (Div. 2) C. Rectangle Puzzle 数学题几何
- Codeforces Round #202 (Div. 1) A. Mafia(二分,思路)
- Codeforces Round #384 (Div. 2)E(状压dp+二分,好题)
- Codeforces Round #307 (Div. 2) C. GukiZ hates Boxes 贪心/二分
- 【Codeforces Round 330 (Div 2)D】【计算几何 二分答案】Max and Bike 最小骑车距离使得圆上传感器很坐标位移为dis