「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' ...
随机推荐
- DAY2敏捷冲刺
站立式会议 工作安排 (1)服务器配置 (2)数据库连接 (3)页面创意 燃尽图 代码提交记录 感想 林一心:centos配置服务器真的算是一个不小的坑,目前数据库配置清楚,脚本部署好明天测试交互,还 ...
- 团队作业7——第二次项目冲刺(Beta版本)-第二篇
1.工作分工: 团队成员 分工 郭达22120 项目整合,后台代码 刘德培44060 数据库模块 石浩洋22061 前台界面优化 曾繁钦22056 前台界面优化.测试 孙斌22030 后台代码 2.燃 ...
- Debian常用設置
1. 更新軟件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list_bak #備份 sudo vi /etc/apt/sources.list / ...
- cURL和file_get_contents实现模拟post请求
以前面试时候,面试官问过我后端有没有跨域问题,但是不敢肯定,现在可以肯定的说没有. 不文用php的cURL和file_get_contents方法分别实现后端跨域.本文场景也是在tp5下实现的. 一, ...
- C语言100例02 PHP版(练习)
问题: 企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 20万到 ...
- solr 学习之数据导入
将数据库中的数据导入到我们的solr索引库中(DataImportHandler) 1.将jdbc的jar包和solr包中的DataImport的jar包拷贝到webapp中solr/WEB-INF/ ...
- VM新安装centos7无法连接网络的问题
https://blog.csdn.net/u012110719/article/details/42264601 https://blog.csdn.net/kexiaoling/article/d ...
- mysql(二) 慢查询分析(一)
如下表结构: CREATE TABLE `trade_order` ( `order_id` ) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单编号', `t ...
- 复杂类型的write写入功能 步骤解析
- 【bzoj4921】[Lydsy六月月赛]互质序列 暴力
题目描述 给出一个序列,要求删除一段非空区间,使得剩下的数的个数大于等于2.求所有删除方式剩下的数的最大公约数的和. 输入 第一行包含一个正整数n(3<=n<=100000),表示序列的长 ...