Codeforces 620F Xors on Segments(暴力+DP)

本文介绍了一种解决XorsonSegments问题的方法,通过预处理和动态规划实现了O(n²)的时间复杂度。首先预处理出x[i] = 1 xor 2 xor ... xor i,再使用动态规划求解每个询问的最大答案。

题目链接 Xors on Segments

预处理出$x[i]$ $=$ $1$ $xor$ $2$ $xor$ $3$ $xor$ $……$ $xor$ $i$

话说这题$O(n^{2})$居然能过

先对询问离线。

然后$dp[i]$表示以$a[i]$为开头的所有连续序列中最大答案。

然后依次处理到$a[j]$的时候如果以$j$为右端点的询问的左端点小于等于$i$则更新。

复杂度$O(n^{2})$

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)    for (int i(a); i <= (b); ++i)

int x[1000010], a[50010], l[50010], r[50010], ans[5010];
vector < pair <int, int> > v[50010];
int n, q;

int main(){

    rep(i, 1, 1000001) x[i] = x[i - 1] ^ i;
    scanf("%d%d", &n, &q);
    rep(i, 1, n) scanf("%d", a + i);
    rep(i, 1, q){
        scanf("%d%d", l + i, r + i);
        v[r[i]].push_back({l[i], i});
    }

    rep(i, 1, n){
        int dp = 0;
        rep(j, i, n){
            dp = max(dp, x[a[i]] ^ x[a[j]] ^ min(a[i], a[j]));
            for (auto u : v[j]){
                if (u.first <= i) ans[u.second] = max(ans[u.second], dp);
            }
        }
    }

    rep(i, 1, q) printf("%d\n", ans[i]);
    return 0;
}

 

转载于:https://www.cnblogs.com/cxhscst2/p/6720465.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值