题目链接 Xors on Segments
预处理出x[i] = 1 ^ 2 ^ 3 ^ …… ^ i;
(话说这题O(N^2居然能过))
先对询问离线。
然后dp[i]表示以a[i]为开头的所有连续序列中最大答案。
然后依次处理到a[j]的时候如果以j为右端点的询问的左端点小于等于i则更新。
复杂度O(N^2)
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define rep(i, a, b) for (int i(a); i <= (b); ++i) 6 7 int x[1000010], a[50010], l[50010], r[50010], ans[5010]; 8 vector < pair <int, int> > v[50010]; 9 int n, q; 10 11 int main(){ 12 13 rep(i, 1, 1000001) x[i] = x[i - 1] ^ i; 14 scanf("%d%d", &n, &q); 15 rep(i, 1, n) scanf("%d", a + i); 16 rep(i, 1, q){ 17 scanf("%d%d", l + i, r + i); 18 v[r[i]].push_back({l[i], i}); 19 } 20 21 rep(i, 1, n){ 22 int dp = 0; 23 rep(j, i, n){ 24 dp = max(dp, x[a[i]] ^ x[a[j]] ^ min(a[i], a[j])); 25 for (auto u : v[j]){ 26 if (u.first <= i) ans[u.second] = max(ans[u.second], dp); 27 } 28 } 29 } 30 31 rep(i, 1, q) printf("%d\n", ans[i]); 32 return 0; 33 }
时间: 2024-10-19 17:21:45