P7502 「HMOI R1」不知道是啥的垃圾题 题解
Link.
Description.
给定一个二元组集合 \(S\),要求支持:
- 插入一个二元组 \((a,b)\)
- 删除一个二元组 \((a,b)\)
- 给定 \((x,y)\),求 \(\sum_{(a,b)\in S}[x\oplus a>y\oplus b]\)
Solution.
启发:Trie 可以不是严格二叉树。
直接维护一个四叉 Trie,然后就有了一个 \(O(n^2)\) 的暴力做法。
发现如果当前 \(\oplus\) 相同才会有问题,所以直接对 \(a\oplus b\) 建立 Trie。
复杂度变成了 \(O(n\log V)\)。
Coding.
点击查看不行代码
//是啊……你就是那只鬼了……所以被你碰到以后,就轮到我变成鬼了{{{
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
template<typename T>inline void read(T &x)
{
x=0;char c=getchar(),f=0;
for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1;
for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48);
f?x=-x:x;
}
template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}/*}}}*/
int ch[12000005][2],sn[12000005][4],tt,rt;
#define bit(x) ((x>>d)&1)
inline void ins(int &x,ll a,ll b,int c,int d=60)
{
if(!~d) return;else sn[x?x:x=++tt][bit(a)<<1|bit(b)]+=c;
ins(ch[x][bit(a)^bit(b)],a,b,c,d-1);
}
inline int qry(int x,ll a,ll b,int d=60)
{
if(!x||!~d) return 0;
return sn[x][(bit(a)^1)<<1|bit(b)]+qry(ch[x][bit(a)^bit(b)],a,b,d-1);
}
inline void solve() {int fg;ll a,b;read(fg,a,b);if(fg^3) ins(rt,a,b,fg&1?1:-1);else printf("%d\n",qry(rt,a,b));}
int main() {int Ca;for(read(Ca);Ca--;) solve();return 0;}