「6月雅礼集训 2017 Day5」吃干饭
【题目大意】
询问[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」吃干饭的更多相关文章
- 「6月雅礼集训 2017 Day5」学外语
[题目大意] 给出$\{P_i\}$,求经过以下操作后能够得到的不同序列个数: 第一步,选择$i, j$,交换$P_i,P_j$:第二步,把所有$P_x=i$的$P_x$变为$j$,把所有$P_x=j ...
- 「6月雅礼集训 2017 Day5」仰望星空
[题目大意] 给你$n$个点,被一个半径为$R$的元圆划分成内(包含边界).外两个部分. 要连若干线,每个点只能连一条线,不存在重点和三点共线. 线只能连在内部点和外部点之间,线长度不超过$d$. 如 ...
- 「6月雅礼集训 2017 Day10」quote
[题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...
- 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)
原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...
- 「6月雅礼集训 2017 Day11」delight
[题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...
- 「6月雅礼集训 2017 Day11」jump
[题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...
- 「6月雅礼集训 2017 Day11」tree
[题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...
- 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)
[题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...
- 「6月雅礼集训 2017 Day8」route
[题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...
随机推荐
- node.js安装部署
node js 安装部署学习 CentOS 下安装 Node.js 1.下载源码,你需要在https://nodejs.org/en/download/下载最新的Nodejs版本,链接: http ...
- PHP 将一个字符串部分字符用$re替代隐藏
<?php/** * 将一个字符串部分字符用$re替代隐藏 * @param string $string 待处理的字符串 * @param int $start 规定在字符串的何处开始, * ...
- UVALive - 6886 Golf Bot 多项式乘法(FFT)
题目链接: http://acm.hust.edu.cn/vjudge/problem/129724 Golf Bot Time Limit: 15000MS 题意 给你n个数,m个查询,对于每个查询 ...
- iOS开发JOSNModel<optional>,<convertondemand>,<index>
指定定义的key的类型 <optional>表示字段可选,例如 //链接字段是可选的,转换的时候允许link未空 @property (nonatomic,strong) NSString ...
- BAT批处理(四)
网络命令 net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" / ...
- 抓取进程中包括其所有线程的iowait时间
perf事件是可以按照线程按照进程统计的呢,但是/proc/接口就不提供这样的功能 hon@station6:/proc/6288$ sudo perf stat -e sched:sched_swi ...
- 【Python】python 调用c语言函数
虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了具体流程:c编写相关函数 ,编译成库然后在python中加载这些库,指定调用函数.这些函数 ...
- matlab中nargin函数的用法
nargin是用来判断输入变量个数的函数,这样就可以针对不同的情况执行不同的功能. 通常可以用他来设定一些默认值,如下面的函数. 例子,函数test1的功能是输出a和b的和.如果只输入一个变量,则认为 ...
- [洛谷P4512]【模板】多项式除法
题目大意:给定一个$n$次多项式$F(x)$和一个$m$次多项式$G(x)$,请求出多项式$Q(x),R(x)$,满足: 1. $Q(x)$次数为$n-m$,$R(x)$次数小于$m$2. $F(x) ...
- HDU2089:不要62——题解
http://acm.hdu.edu.cn/showproblem.php?pid=2089 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管 ...