Bzoj2728 [HNOI2012]与非

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 753  Solved: 361

Description

Input

输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述。 100%的数据满足K≤60且N≤1000,0<=Ai<=2^k-1,0<=L<=R<=10^18

Output

仅包含一个整数,表示[L,R]内可以被计算出的数的个数

Sample Input

3 3 1 4
3 4 5

Sample Output

4

HINT

样例1中,(3 NAND 4) NADN (3 NAND 5) = 1,5 NAND 5 = 2,3和4直接可得。

Source

day1

位运算 线性基 DP

一个数与非自己,结果等于非(Not)

Not(x Nand y) = x And y

not+and可以搞出所有逻辑运算。

可以据此从读入的数中找出所有线性基,然后由大到小使用线性基,进行数位DP。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #define LL long long
 6 using namespace std;
 7 const int mxn=1010;
 8 LL read(){
 9     LL x=0,f=1;char ch=getchar();
10     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
11     while(ch>=‘0‘ && ch<=‘9‘){x=x*10-‘0‘+ch;ch=getchar();}
12     return x*f;
13 }
14 int n,k;
15 LL L,R;
16 LL a[mxn],b[mxn],p[mxn];
17 int cnt=0;
18 bool vis[mxn];
19 LL solve(LL x){//数位DP
20     if(x==-1)return -1;
21     int i;
22     LL res=0,ans=0;
23     for(i=1;i<=cnt;i++)
24         if(res+p[i]<=x){
25             res+=p[i];
26             ans+=(1LL<<cnt-i);
27         }
28     return ans;
29 }
30 int main(){
31     int i,j;
32     n=read();k=read();L=read();R=read();
33     LL ed=(1LL<<k)-1;
34     for(i=1;i<=n;i++)a[i]=read();
35     LL now=0;
36     for(i=k-1;i>=0;i--){
37         if(!vis[i]){
38             now=ed;
39             for(j=1;j<=n;j++){
40                 if((a[j]>>i)&1)    now&=a[j];
41                 else now&=(~a[j]);
42             }
43             for(j=0;j<=i;j++)
44                 if((now>>j)&1)vis[j]=1;
45             p[++cnt]=now;
46         }
47     }
48     printf("%lld\n",solve(R)-solve(L-1));
49     return 0;
50 }
51     
时间: 2024-10-10 18:04:35

Bzoj2728 [HNOI2012]与非的相关文章

【BZOJ2728】[HNOI2012]与非 并查集+数位DP

[BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述. 100%的数据满足K≤60且N≤1000,0<=Ai<=2^k-1,0<=L<=R<=10^18 Output 仅包含一个整数,表示[L,R]内可以被计算出的数的个数 Sample Input 3 3 1 4 3 4 5 Sample Output 4 HINT 样例1中,(3

BZOJ 2728 HNOI2012 与非 高斯消元

题目大意:给定k位二进制下的n个数,求[l,r]区间内有多少个数能通过这几个数与非得到 首先观察真值表 我们有A nand A = not A 然后就有not ( A nand B ) = A and B 与和非都弄到了,我们就可以做出一切逻辑运算了,比如说或和异或 A or B = not ( ( not A ) and ( not B ) ) A xor B = ( A or B ) and ( A nand B ) 然后我们对于位运算可以发现一个性质 对于某两位来说,如果对于每一个数,这两

H5版如何在微信外(非微信浏览器)进行微信支付技术方案

官方是支持在非微信内置浏览器中调起微信支付的!H5支付是基于公众号基础开发的一种非微信内浏览器支付方式(需要单独申请支付权限),可以满足在微信外的手机H5页面进行微信支付的需求.同时,由于H5链接传播十分方便.来源不易追踪,商户需要特别注意做好防钓鱼.防刷单的处理,控制风险. 流程原理 接口说明 (1)用户打开商户H5网页选购商品,生成支付订单:(2)商户调用[统一下单]接口(接口中trade_type需定义为WAP),获得预支付交易会话标识prepayid:(3)商户按照微信H5支付协议生成d

maven依赖本地非repository中的jar包-依赖jar包放在WEB-INF/lib等目录下的情况客户端编译出错的处理

maven依赖本地非repository中的jar包 http://www.cnblogs.com/piaolingxue/archive/2011/10/12/2208871.html 博客分类: MAVEN 今天在使用maven编译打包一个web应用的时候,碰到一个问题: 项目在开发是引入了依赖jar包,放在了WEB-INF/lib目录下,并通过buildpath中将web libariary导入. 在eclipse中开发没有问题,但是使用maven编译插件开始便宜总是报找不到WEB-INF

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.

重现二叉树非递归算法的构建过程

递归完毕树的遍历非常好理解,倘若是非递归.不要告诉我算法导论上有,我要maker的思考过程 既然递归可以实现,那就模拟递归. 递归的本质就是压栈. 首先简单树.观察递归的压栈过程 A.B即使节点的数据也代表节点的地址. 对这棵树使用递归完毕前序创建 #include <iostream> using namespace std; struct treenode; typedef struct treenode* TREE; struct treenode { char data; TREE l

斐波那契数列的递归和非递归解法

//递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1; } return fib(n - 1) + fib(n - 2); } //非递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

Java NIO实现非阻塞式socket通信

博主知识水平有限,只能提供一个个人的狭隘的理解,如果有新人读到这儿,建议看一下其他教程或者API,如果不明白,再来看一下:如果有dalao读到这儿,希望能指出理解中的问题~谢谢 Java提供了用于网络通信的socket和serversocket包,然而实现方式是阻塞式的,同一时间点上只能进行一个连接,这会带来不好的体验.当然了,我们也可以通过不断创建线程的方式管理连接,但线程多了的话反而会降低效率.于是Java推出了非阻塞式IO--channel.并且channel提供关于网络通信的相关chan