【题目大意】

询问[L,R]中选若干个数异或起来得到的答案集合大小。多组数据。

对于50%的数据,$R - L \leq 10^4$

对于100%的数据,$R - L \leq 10^{18}, T \leq 10^2$

【题解】

考虑50%的数据,暴力线性基即可。

这样的复杂度是$O(T(R-L)logn)$

观察到数据比较特殊,是连续的一段正整数,我们写完线性基暴力然后打个表观察数在什么时候被插入到线性基里。

我们以[23333, 66666]为例:

首先L=23333,这个数一定被插入到线性基的最高位

考虑线性基的每一位什么时候会变化

下面是每位被插入的时候的值,下方标有“.”的为被插入到线性基的哪一位

就大概这样一个过程,可以观察到每次插入线性基的下一个数,都是上一个数从后往前的最早一个0,满足它所在的位还没有被插入到线性基里,为了插入这个位,我们需要把它变成1,这个暴力算一下就好了。

然后我们最多插入log位,每次找从后往前第一个没有被插入到线性基里的0最多log的复杂度,总复杂度$O(Tlog^2C)$,其中C为数的范围。

还有另一种解法,这里提一下,代码实现极其简单就不写了。。

就是 ans[L,R] = ans[L/2, R/2] * 2 (R-L >= 3)。

相当于抹去线性基最后一位,由于区间长度比较长,所以线性基最后一位一定存在贡献。

当R-L>=3一定有贡献,R-L=2和=1的时候特判一下,递归下去做即可。复杂度$O(TlogC)$。

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; const int M = 2e5 + , N = 1e5 + , F = + ;
const int mod = ; int n;
// ll Lbase[F];
ll L, R;
ll bin[F];
bool hv[F]; # define bit(x, i) (((x) >> (i)) & ) inline ll getll() {
ll x = ; char ch = getchar();
while(!isdigit(ch)) ch = getchar();
while(isdigit(ch)) x = x* + ch - '', ch = getchar();
return x;
} /*
inline void sol() {
L = getll(), R = getll();
for (int i=62; ~i; --i) Lbase[i] = 0;
for (int i=L; i<=R; ++i) {
int x = i;
for (int j=62; ~j; --j) {
if(bit(x, j)) {
if(Lbase[j] == 0) {
Lbase[j] = x;
// printf("base[ %d ] = %d, origin = %d \n", j, x, i);
break;
}
x ^= Lbase[j];
}
}
}
int times = 0;
for (int i=62; ~i; --i) if(Lbase[i] != 0) ++times;
printf("%lld\n", bin[times]);
}
*/ int gpos;
inline ll gnext(ll x) {
// first 0
int pos = ;
for (int i=; i<=; ++i) {
if(!bit(x, i) && !hv[i]) {
pos = i;
break;
}
}
ll tem = ;
for (int i=pos; i>=; --i) tem = (tem * ) + bit(x, i);
tem = bin[pos] - tem;
gpos = pos;
return x+tem;
} inline void sol2() {
L = getll(), R = getll();
if(L == && R == ) {
puts("");
return ;
}
L = max(L, 1ll);
for (int i=; i<=; ++i) hv[i] = ;
int nL = ;
for (int i=; i; --i)
if(bin[i] > L && bin[i-] <= L) nL = i;
ll cur = L, tem;
hv[nL - ] = ;
while((tem = gnext(cur)) <= R) {
cur = tem;
hv[gpos] = ;
// printf("%I64d\n", cur);
// system("pause");
}
int times = ;
for (int i=; i<=; ++i) times += hv[i];
cout << bin[times] << endl;
} int main() {
freopen("manger.in", "r", stdin);
freopen("manger.out", "w", stdout);
bin[] = ;
for (int i=; i<=; ++i) bin[i] = bin[i-] * ;
int T; cin >> T;
while(T--) sol2();
return ;
}
/* e.g 23333 66666 101101100100101
. 101101100100110
. +1 101101100100111
. +1 101101100101000
. +1 101101100101100
. +4 101101100110000
. +4 101101101000000
. +16 101101101100000
. +32 101101110000000
. +32 */

「6月雅礼集训 2017 Day5」吃干饭的更多相关文章

  1. 「6月雅礼集训 2017 Day5」学外语

    [题目大意] 给出$\{P_i\}$,求经过以下操作后能够得到的不同序列个数: 第一步,选择$i, j$,交换$P_i,P_j$:第二步,把所有$P_x=i$的$P_x$变为$j$,把所有$P_x=j ...

  2. 「6月雅礼集训 2017 Day5」仰望星空

    [题目大意] 给你$n$个点,被一个半径为$R$的元圆划分成内(包含边界).外两个部分. 要连若干线,每个点只能连一条线,不存在重点和三点共线. 线只能连在内部点和外部点之间,线长度不超过$d$. 如 ...

  3. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  4. 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...

  5. 「6月雅礼集训 2017 Day11」delight

    [题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...

  6. 「6月雅礼集训 2017 Day11」jump

    [题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...

  7. 「6月雅礼集训 2017 Day11」tree

    [题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...

  8. 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)

    [题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...

  9. 「6月雅礼集训 2017 Day8」route

    [题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...

随机推荐

  1. P4语法(2) Parser

    这里参考学习了: P4语言规范 P4台湾社群 Parser 关于parser 在P4程序中,有着大量的首部(header)和首部实例,但每次只有部分首部实例会对数据包进行操作,而parser会用于生成 ...

  2. lintcode-163-不同的二叉查找树

    163-不同的二叉查找树 给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种? 样例 给出n = 3,有5种不同形态的二叉查找树: 标签 卡特兰数 动态规划 思路 参考博客http:// ...

  3. iOS-加载html字符串

    NSMutableAttributedString * attrString =[[NSMutableAttributedString alloc] initWithData:[resultModel ...

  4. BZOJ 1791 岛屿(环套树+单调队列DP)

    题目实际上是求环套树森林中每个环套树的直径. 对于环套树的直径,可以先找到这个环套树上面的环.然后把环上的每一点都到达的外向树上的最远距离作为这个点的权值. 那么直径一定就是从环上的某个点开始,某个点 ...

  5. 【bzoj1202】[HNOI2005]狡猾的商人 带权并查集

    题目描述 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表 ...

  6. BZOJ4813 CQOI2017小Q的棋盘(树形dp)

    设f[i][j]为由i号点开始在子树内走j步最多能经过多少格点,g[i][j]为由i号点开始在子树内走j步且回到i最多能经过多少格点,转移显然. #include<iostream> #i ...

  7. 进程池-限制同一时间在CPU上运行的进程数

    if __name__=='__main__' :  为了区分你是主动执行这个脚本,还是从别的地方把它当做一个模块去调用. 如果是主动执行,则执行.如果是调用的,则不执行主体. 1. 串行:切记切记: ...

  8. javascript中的this作用域详解

    javascript中的this作用域详解 Javascript中this的指向一直是困扰我很久的问题,在使用中出错的机率也非常大.在面向对象语言中,它代表了当前对象的一个引用,而在js中却经常让我觉 ...

  9. 【刷题】洛谷 P3901 数列找不同

    题目描述 现有数列 \(A_1,A_2,\cdots,A_N\) ,Q 个询问 \((L_i,R_i)\) , \(A_{Li} ,A_{Li+1},\cdots,A_{Ri}\) 是否互不相同 输入 ...

  10. java.util.Stack类简介(栈)

    Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起stack具有更好的完整性和一致性,应该被优先使用 ...