码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces1100F. Ivan and Burgers(离线+线性基)

时间:2019-01-15 23:30:49      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:main   vector   pair   sed   bre   bsp   ack   push   class   

题目链接:传送门

思路:

  按查询的右端点离线。

  然后从左到右维护线性基。

  每个基底更新为最右边的方案,可以让尽量多的查询享受到这个基底。

  用ci维护后更新右端点为i的答案。

代码(析构1000ms,别学我):

技术分享图片
#include <bits/stdc++.h>
#define P pair<int, int>
#define F first
#define S second

using namespace std;
const int MAX_N = 5e5 + 5;
const int MAX_B = 20 + 5;

int n, q;
int c[MAX_N];
int bas[MAX_B], pos[MAX_B];
int ans[MAX_N];
vector <P> eve[MAX_N];

inline bool base(int x, int pos) {
    return (x >> pos) & 1;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> c[i];
    cin >> q;
    for (int i = 1, l, r; i <= q; i++) {
        cin >> l >> r;
        eve[r].push_back(P(l, i));
    }

    for (int i = 1; i <= n; i++) {
        int x = c[i], p = i;
        for (int b = 20; b >= 0; b--) {
            if (base(x, b)) {
                if (!bas[b]) {
                    bas[b] = x;
                    pos[b] = p;
                    break;
                }
                if (pos[b] < p) swap(bas[b], x), swap(pos[b], p);
                x ^= bas[b];
            }
        }
        for (auto &p : eve[i])
            for (int b = 20; b >= 0; b--)
                if (p.F <= pos[b])
                    ans[p.S] = max(ans[p.S], ans[p.S]^bas[b]);
    }
    for (int i = 1; i <= q; i++)
        cout << ans[i] << \n;
    return 0;
}
View Code

 

Codeforces1100F. Ivan and Burgers(离线+线性基)

标签:main   vector   pair   sed   bre   bsp   ack   push   class   

原文地址:https://www.cnblogs.com/Lubixiaosi-Zhaocao/p/10274793.html

(2)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!