标签: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; }
Codeforces1100F. Ivan and Burgers(离线+线性基)
标签:main vector pair sed bre bsp ack push class
原文地址:https://www.cnblogs.com/Lubixiaosi-Zhaocao/p/10274793.html