「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' ...
随机推荐
- spring框架(1)— 依赖注入
依赖注入 spring核心容器就是一个超级大工厂,所以的对象(数据源.hibernate SessionFactory等基础性资源)都会被当做spring核心容器的管理对象——spring把容器中的一 ...
- LintCode-159.寻找旋转排序数组中的最小值
寻找旋转排序数组中的最小值 假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2). 你需要找到其中最小的元素. 你可以假设数组中不存在重复的 ...
- C++多态实现与继承
面向对象的三个基本特征 面向对象的三个基本特征是:封装.继承.多态.其中, 封装可以隐藏实现细节,使得代码模块化: 继承可以扩展已存在的代码模块(类),它们的目的都是为了——代码重用: 而多态则是为了 ...
- 【week3】四人小组项目—东师论坛
项目选题:东北师范大学论坛 小组名称:nice! 项目组长:李权 组员:于淼 刘芳芳 杨柳. 本周任务: 1.发布申请 功能列表: 1.注册,登录 2.校内信息公告推送 3.十大热点 (根据搜索量.评 ...
- C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [剑指Offer] 55.链表中环的入口结点
题目描述 一个链表中包含环,请找出该链表的环的入口结点. [思路]根据set集合的不重复,遍历链表时遇到的第一个重复结点就是环的入口结点. /* struct ListNode { int val; ...
- Django 2.0 学习(06):Django 视图(进阶)
概述 Django中的特方法,该方法代表了Django的Web页面,并且视图具有特定的模板.以博客应用为例进行说明,在博客应用中应该包含下面的视图: 博客主页:显示最近的一些记录: 详细页面:单个详细 ...
- openstack之horizon部署
登录官网 www.openstack.org 查看安装文档 https://docs.openstack.org/newton/install-guide-rdo/horizon.html 第一步yu ...
- BZOJ4813 CQOI2017小Q的棋盘(树形dp)
设f[i][j]为由i号点开始在子树内走j步最多能经过多少格点,g[i][j]为由i号点开始在子树内走j步且回到i最多能经过多少格点,转移显然. #include<iostream> #i ...
- BZOJ4735 你的生命已如风中残烛(组合数学)
将每个位置上的数都-1,则显然相当于前缀和始终非负. 然后就是完全想不到的了.考虑往里面加一张-1的牌.假设在一个合法排列的最后添上一个-1,那么在该排列的所有循环同构排列中,满足前m个前缀和都非负的 ...