Bitwise And Queries

Bitwise And Queries

Time limit: 1500 ms
Memory limit: 128 MB

You are given QQ queries of the form a\ b\ xa b x. Count the number of values yy such that a \leq y \leq ba≤y≤b and x\ \& \ y = xx & y=x, where we denote by \&& the bitwise and operation.

Standard input

The first line contains a single integer QQ.

Each of the following QQ lines contains three integers a\ b\ xa b x, representing a query.

Standard output

Output QQ lines, each containing a single integer representing the answer to a query.

Constraints and notes

  • 1 \leq Q \leq 10^51≤Q≤10?5??
  • 1 \leq a \leq b \leq 10^{18}1≤a≤b≤10?18??
  • 0 \leq x \leq 10^{18}0≤x≤10?18??
Input Output
4
1 10 3
5 10 0
1 63 7
32 100 32
2
6
8
37

x&y==x,说明x二进制表示上,有1的地方,y也要有1,是0的地方,y可以是0或者1,记忆化瞎几把搜一下就行了,每次可以选择的有0或1,再判断一下能否取0或1。

lr表示此时这个位置y能否取任意数,只要前面x为0,y为1时,递归选0的话,就说明y后面的数可以任意取了,因为前面有1选了0,那后面无论选什么都不可能超过上界了。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 200005;
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
LL dp[65][2];
int A[65],X[65];
LL solve(int cur,int lr){
    if(cur == 64)return 1;
    if(dp[cur][lr] != -1)return dp[cur][lr];
    if(lr){
        if(A[cur]){
            return dp[cur][lr] = solve(cur + 1,lr);
        }
        else {
            return dp[cur][lr] = 2 * solve(cur + 1,lr);
        }
    }
    else {
        if(A[cur]){
            if(X[cur])return dp[cur][lr] = solve(cur + 1,lr);
            else return dp[cur][lr] = 0;
        }
        else {
            if(X[cur])return dp[cur][lr] = solve(cur+1,1) + solve(cur+1,lr);
            else return dp[cur][lr] = solve(cur+1,lr);
        }
    }
}
void print(int *x){
    for(int i = 0; i < 64; i++)
        printf("%d",x[i]);
    puts("");
}
int main(){
#ifdef local
    freopen("in", "r", stdin);
#endif
    int T;
    scanf("%d",&T);
    while(T--){
        LL x,y,a;
        scanf("%lld%lld%lld",&x,&y,&a);
        x--;
        for(int i = 0; i < 64; i++){
            A[i] = a & 1;
            a >>= 1;
        }
        reverse(A,A+64);
//        print(A);
        for(int i = 0; i < 64; i++){
            X[i] = x & 1;
            x >>= 1;
        }
        reverse(X,X+64);
//        print(X);
        memset(dp,-1,sizeof dp);
        LL res = solve(0,0);
        for(int i = 0; i < 64; i++){
            X[i] = y & 1;
            y >>= 1;
        }
        reverse(X,X+64);
//        print(X);
        memset(dp,-1,sizeof dp);
        res = solve(0,0) - res;
        printf("%lld\n",res);
    }
}

时间: 2024-12-15 12:17:35

Bitwise And Queries的相关文章

SSAS: Using DMV Queries to get Cube Metadata

References https://msdn.microsoft.com/en-us/library/ms126079.aspx Schema Rowset1 Description DISCOVER_INSTANCES Rowset Describes the instances on the server. DISCOVER_KEYWORDS Rowset (OLE DB for OLAP) Enumerates a list of words reserved by the provid

HDU4027 Can you answer these queries 线段树区间求和+剪枝

给了你n,然后n个数字在一个数组中,接下来m个询问,每个询问三个数字 t,x,y,若t==0,那么修改区间[x,y]的每一个值,变为原来每个位置上的数 开根号取整,若t==1,那么对区间[x,y]求和 由于n,m,很大,所以树状数组铁定超时,若直接用线段树来做区间修改,那么也是超时,这类题目没别的方法了,静心剪枝,发现题目给的数据范围为2^63,有没有发现,2^63开根号 绝对不需要开10次,就能到1,到1以后就不需要再开了,意思就是若有某个区间[x,y]每一个点的值都为1时,这一段区间事实上是

[CodeChef - GERALD07 ] Chef and Graph Queries

Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected graph G. This graph consists of N vertices and M edges. Each vertex of the graph has an unique index from 1 to N, also each edge of the graph has an uniq

JavaScript根据CSS的Media Queries来判断浏览设备的方法

CSS 部分 首先随便新建一个用来做判断的类,然后通过 Media Queries 来对这个类的 z-index 属性赋予不同的值.这个类仅作为 JavaScript 读取使用,所以需要将其移出屏幕窗口,让浏览者不可见以免引起意外情况. 作为演示,下面代码设置了四种设备状态:桌面普通版.小屏幕桌面版.平板电脑版和手机版. /* default state */ .state-indicator { position: absolute; top: -999em; left: -999em; z-

lightoj Again Array Queries

1100 - Again Array Queries   PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 MB Given an array with n integers, and you are given two indices i and j (i ≠ j) in the array. You have to find two integers in the range whose diffe

响应式web设计之CSS3 Media Queries

开始研究响应式web设计,CSS3 Media Queries是入门. Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以此来应用不同的样式表.换句话说,其允许我们在不改变内容的情况下,改变页面的布局以精确适应不同的设备. 那么,Media Queries是如何工作的? 两种方式,一种是直接在link中判断设备的尺寸,然后引用不同的css文件: <link rel="stylesheet" type="text/css" href=

Medial Queries的另一用法:实现IE hack的方法

所谓Medial Queries就是媒体查询. 随着Responsive设计的流行,Medial Queries可算是越来越让人观注了.他可以让Web前端工程实现不同设备下的样式选择,让站点在不同的设备中实现不同的效果. 众所周知,有些时候为了实现IE下的某些效果与现代浏览器一致,我们不得不使用一些hack手段来实现目的.比如说使用“\0”,“\”和“\9”来仅让IE某些版本识别,而对于现代浏览器来说,他会直接无视这些代码.今天我想为大家介绍的是使用@media实现IE hack的方法. 仅IE

hdu 5412 CRB and Queries(线段树套笛卡尔树 - 动态区间第k大)

题目链接:hdu 5412 CRB and Queries 首先对所有出现过的值排序,建立线段树,每个线段树的节点是一棵笛卡尔树,笛卡尔树记录区间下标值. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; #define lson(x) (x<<1) #define rson(x) ((x<<

hdu4027 Can you answer these queries?

Problem Description A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use our secret weapon to eliminate the battleships. Each of the battleships can be marked a value of endurance. For every attack of ou