题目:Problem - 6964 (dingbacode.com)
题目大意是m个询问,每个询问给出问题区间和a,b,问你在给定区间内有多少个数c满足c异或a<=b。
因为要处理异或,所以用字典树存数字并进行维护。也可以用分块做,这里写的是字典树。用莫队处理区间并进行增删数字,每次查询时就到树上按位数从高位到低位找。注意查找时的数字关系。
代码:
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
struct side {
int l, r;
int a, b;
int id;
}aa[100005];
struct node {
int s[2];
int cnt[2];
}tre[4000006];
int n,nn;
bool cmp(side x, side y)
{
if (x.l/nn != y.l/nn)return x.l < y.l;
else return x.r < y.r;
}
void add(int x)
{
static int t = 0;
int p = 0, i,y;
for (i = 16;i >= 0;i--)
{
y = (x >> i