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

Posted lubixiaosi-zhaocao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces1100F. Ivan and Burgers(离线+线性基)相关的知识,希望对你有一定的参考价值。

题目链接:传送门

思路:

  按查询的右端点离线。

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

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

  用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] << 
;
    return 0;
}
View Code

 

以上是关于Codeforces1100F. Ivan and Burgers(离线+线性基)的主要内容,如果未能解决你的问题,请参考以下文章

codeforces 1100F Ivan and Burgers 线性基 离线

F. Ivan and Burgers(线性基,离线)

Codeforces 1248 div2 C. Ivan the Fool and the Probability Theory (思维)

Codeforces Round #594 (Div. 2) C. Ivan the Fool and the Probability Theory

codeforces 1100D-Dasha and Chess

Andrew and Taxi CodeForces - 1100E (思维,拓扑)