首页 > 其他分享 >题解 AGC015D【A or...or B Problem】

题解 AGC015D【A or...or B Problem】

时间:2023-10-07 22:12:45浏览次数:31  
标签:__ ... le 题解 10000000 AGC015D Problem include

题解 AGC015D【A or...or B Problem】

problem

从 \(\ge A\) 且 \(\le B\) 的整数中选择一个或多个,把这些整数按位或,求一共有多少种可能的结果。

\(1\le A\le B \le 2^{60}\)

solution

首先暴力怎么写呢?FWT。设序列 \(a_i=[L\leq i\leq R]\),然后对它 FWT-or 之后自己乘几倍,再翻回去。然后输入几组样例,我们可以大概知道是什么东西了。建议输入样例 \(L=123,R=152\)。以下说说瞪出来的规律。

首先 \(L,R\) 的公共前缀是没有用的,不如删除,这样以后认为 \(R\) 的最高位是 \(1\),\(L\) 的最高位是 \(0\)。然后答案显然需要先包括 \([L,R]\),且因为 \(a|b\geq \max(a, b)\),所以可能的结果只会更大。

考虑有了 \([L,R]\) 之后能构造 \(R+1\) 吗?需要看情况,例如:\(R=10001001_2\) 的时候,显然可以用 \(1000100\underline{0}_2\) 和 \(1000\underline{0}0\underline{10}_2\) 或一下,就是说我们可以去掉 \(R\) 的第二个 \(1\),来获得 \(R+1\) 的没有第二个 \(1\) 的版本,然后或上第二个 \(1\) 后面全是零的一个数,构造出 \(R+1\)。那么就是说我们的 \(R\) 的第二个 \(1\) 后面可以全部放满一,不影响答案(如上面的例子可以将 \(R\) 直接改为 \(10001111_2\))。再要更高的位,单靠 \(R\) 就无法做到。

考虑 \(L\)。举例 \(L=01011101_2,R=10001001\to 10001111_2\),我们可以用 \([L,10000000_2)\) 中的数和 \(10000000_2\) 或一下,获得 \([L+10000000_2,11111111_2]\) 中的数。

除此之外没有别的数字,对 \([L,R']\) 和 \([L+10000000_2,11111111_2]\) 求并就是答案。

根据上面的构造,还可以发现这些可能的结果只需要两个数字或即可。所以 FWT 开平方就够了。

若认为高贵的 __builtin_clzll 是常数复杂度,则整个题的复杂度是常数。不用就是 \(O(\log R)\)。

code

#include <cstdio>
#include <vector>
#include <cstring>
#include <cassert>
#include <algorithm>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr, ##__VA_ARGS__)
#else
#define debug(...) void(0)
#endif
#define bitclz __builtin_clzll
typedef long long LL;
LL getBit(int k) { return 1ll << k; }
bool conBit(LL x, int k) { return x & getBit(k); }
LL L, R;
int main() {
    freopen("or.in", "r", stdin);
    freopen("or.out", "w", stdout);
    scanf("%lld%lld", &L, &R);
    if (L == R) return puts("1"), 0;
    int b = 63 - bitclz(L ^ R);
    assert(conBit(R, b) && !conBit(L, b));
    for (int i = b - 1; i >= 0; i--) if (conBit(R, i)) {
        R |= getBit(i) - 1;
        break;
    }
    LL U = (getBit(b) - 1) | (R >> b << b);
    LL D = L | (R >> b << b);
    if (R < D) printf("%lld\n", R - L + 1 + U - D + 1);
    else printf("%lld\n", U - L + 1);
    return 0;
}

标签:__,...,le,题解,10000000,AGC015D,Problem,include
From: https://www.cnblogs.com/caijianhong/p/solution-agc015d.html

相关文章

  • 掲示板题解
    ffe8c57a-0e48-42bc-88e9-094ce62874ec[传送门](https://www.luogu.com.cn/problem/AT1409)题意分析-----------将第$i$个数提到第一个并输出,也就是倒着扫并输出。倒数第一成为第一,倒数第二成为第二,以此类推,输出该数后标记,最后再枚举一遍,如果没有输出就将它们按正序输出。思路-......
  • holiday 假期题解(洛谷搬家)
    P5892holiday假期题解前言:如果您想要过这一道题,需要的前置条件:知道什么是决策单调性。知道可持久化线段树怎么找前$k$大。有耐心看很多文字。对于第二点,如果您不会的话,可以参考我的学习笔记(专门为过这道题做的)。链接:https://i.cnblogs.com/posts/edit;postId=1769732......
  • [TJOI2018] 游园会题解
    [TJOI2018]游园会(dp套dp)目录[TJOI2018]游园会(dp套dp)前言:题目简化:解题思路:较为简单的一步:较为困难的步骤思路总结代码呈现:注释/后记:前言:这是和dp套dp的初遇,这不得好好了解一下。题目简化:先把题目进行简化,就是要构造字符串,对于$len\in[0,k]$满足以下条件:只包含......
  • 【洛谷 P1739】表达式括号匹配 题解(栈)
    表达式括号匹配题目描述假设一个表达式有英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以@作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出YES;否则输出NO。表达式长度小于,左圆括号少于个。输入格式一行:表达式。输出格式一行:YES或NO......
  • ip实验:ospf和isis共存下的问题解决
    一,实验目的:内网正常访问ar4的两个外部静态路由地址二,实验配置思路:引入外部静态后,在ar2上引入带isis里面,会发现ar1是个故障节点(只要是访问外部路由经过该节点时就会发生环路),在ar1上拒绝对应的isis路由的加表(不是双点双向啊,因为ar1上有isis进程,isis的路由表会和ospf路由表抢着加入......
  • 【倍增】ABC212F Greedy Takahashi 题解
    ABC212F暴力就是直接跳,显然不可过。考虑对暴力进行优化,发现整个图是不会改变的,容易想到使用倍增。显然是对边进行倍增的,令\(f_{i,j}\)表示从第\(i\)条边开始,跳了\(2^j\)条边后,到的是哪一条边,如果不存在,则设为\(-1\)。然后就是很显然的倍增了,最后讨论一下即可。时间复......
  • 【主席树】P8201 [传智杯 #4 决赛] [yLOI2021] 生活在树上(hard version)题解
    P8201简单题。题中求的是\(dis_{a,t}\oplusdis_{t,b}=k\)是否存在,显然不好直接维护,考虑转化。令\(dist=dis_{a,t}\oplusdis_{t,b}\),\(val=\bigoplus\limits_{x\in\text{path}(a,b)}w_x\)。如果\(t\)在\(\text{path}(a,b)\)上,则\(dist=val\oplus......
  • 【二分图】CF1139E Maximize Mex 题解
    CF1139E翻译中有一句话:校长将会从每个社团中各选出一个人。就是一些人被分为一组,从每组中选一些人出来。这就很容易想到通过二分图的匹配。\(\text{mex}\)运算有一个显而易见的贪心:枚举每个值能否被匹配,第一个找不到的值就是答案。由于\(\text{mex}\)运算的值域与\(n\)......
  • 网络规划设计师真题解析--TCP慢启动拥塞避免机制
    TCP使用慢启动拥塞避免机制进行拥塞控制。当拥塞窗口大小为16时,发送节点出现超时未收到确认现象时,将采取的措施是(26)。再经过5轮后的拥塞窗口大小为(27)。26、A.将慢启动阈值设为16,将拥塞窗口设为8,并进入拥塞避免阶段B.将慢启动阈值设为16,将拥塞窗口设为1,并进入慢开始阶段C.将慢启动......
  • 网络规划设计师真题解析--TCP慢启动拥塞避免机制
    TCP使用慢启动拥塞避免机制进行拥塞控制。当拥塞窗口大小为16时,发送节点出现超时未收到确认现象时,将采取的措施是(26)。再经过5轮后的拥塞窗口大小为(27)。26、A.将慢启动阈值设为16,将拥塞窗口设为8,并进入拥塞避免阶段B.将慢启动阈值设为16,将拥塞窗口设为1,并进入慢开始阶段C.将慢启动阈......