【题目大意】

询问[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. JSR303中的来验证数据信息

    spring mvc之实现简单的用户管理三 博客分类: spring spring mvc spring mvc dispatcherServlet springspring mvcbean vali ...

  2. 寒假作业end

    开始写博客的个人体会 自己打的链表过不了,果然,心存侥幸是不行的,被揪出来也不错,很感谢畅畅酱. 学术诚信的重要性 爱因斯坦说过:"大多数人说是才智造就了伟大的科学家,他们错了,是人格.&q ...

  3. 福大软工1816 · 第五次作业 - 结对作业2_map与unordered map的比较测试

    测试代码: #include <iostream> using namespace std; #include <string> #include <windows.h& ...

  4. 网络编程--System.Net

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 文件“bin\Debug\WindowsFormsApplication2.exe”正由另一进程使用,因此该进程无法访问该文件。

    http://zhidao.baidu.com/question/221394579.html?qbl=relate_question_2&word=%BE%AF%B8%E6%094%09%C ...

  6. mysql(二) 慢查询分析(一)

    如下表结构: CREATE TABLE `trade_order` ( `order_id` ) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单编号', `t ...

  7. 域对象 pageContext request session servletContext

    pageContext 当前页面之内有效 request   当前的请求内有效 session 当前的会话内有效 servletContext 当前这次服务器生命周期内有效

  8. 【bzoj4641】基因改造 特殊匹配条件的KMP

    题目描述 如果两个长度相等的字符串,如果存在一种字符的一一映射,使得第一个字符串的所有字符经过映射后与第二个字符串相同,那么就称它们“匹配”.现在给出两个串,求第一个字符串所有长度等于第二个字符串的长 ...

  9. nginx日志切割总结

    Nginx日志切割   方法1(脚本+定时执行): #step1:加脚本 cut_nginx_log.sh,主进程把USR1信号发给worker,worker接到这个信号后,会重新打开日志文件 #!/ ...

  10. Python面向对象—类的继承

    一个子类可以继承父类的所有属性,不管是父类的数据属性还是方法. class Father(object): num = 0 def __init__(self): print "I'm Pa ...