某天%你赛出现了一个题目。
我瞎几把做了一下发现需要支持一个区间异或和全局查 \(\geq k\) 的数量的数据结构。
赛后想起来好像不可做。
但是我考场没有智慧,发现不能线段树。然后想到分块,就变成了几个整块全局异或和散块暴力重构。
于是考场搓了个踹。自己随便测了一下好像是对的/yiw
时间复杂度是高贵的 \(O(n\sqrt{n}\log(n))\) !!!11
可以和正解差不多难写的情况下拿下 \(50\) pts 的高分,我太牛啦!!!!!11
struct Trie {
int rt[1200005], flip[1200005][35], cnt[300005 * 35];
int t[300005 * 35][2], siz[3000005];
int tot;
inline Trie() { tot = 0; }
inline void insert(int id, uint x) {
if(!rt[id]) rt[id] = ++tot;
int u = rt[id];
siz[u] += 1;
for(int i = 31; i >= 0; i--) {
if((flip[id][i] & 1) != (cnt[u] & 1)) swap(t[u][1], t[u][0]), cnt[u]++;
if(!t[u][(x >> i) & 1]) t[u][(x >> i) & 1] = ++tot;
u = t[u][(x >> i) & 1];
siz[u] += 1;
}
}
inline int query(int id, uint k, int ret = 0) {
if(!rt[id]) rt[id] = ++tot;
int u = rt[id];
for(int i = 31; i >= 0; i--) {
if((flip[id][i] & 1) != (cnt[u] & 1)) swap(t[u][1], t[u][0]), cnt[u]++;
if(!t[u][(k >> i) & 1]) t[u][(k >> i) & 1] = ++tot;
if(!((k >> i) & 1)) u = t[u][(k >> i) & 1];
else {
ret += siz[t[u][0]];
u = t[u][1];
}
}
return siz[rt[id]] - ret;
}
inline void XOR(int id, uint x) {
if(!rt[id]) rt[id] = ++tot;
for(int i = 0; i <= 31; i++) flip[id][i] += ((x >> i) & 1);
}
} trie;
标签:,rt,cnt,int,tot,++,id
From: https://www.cnblogs.com/QAQ-C14/p/-/not-qiang-trie