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; }
以上是关于Codeforces1100F. Ivan and Burgers(离线+线性基)的主要内容,如果未能解决你的问题,请参考以下文章
codeforces 1100F 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