BZOJ 2728: [HNOI2012]与非
2728: [HNOI2012]与非
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 786 Solved: 371
[Submit][Status][Discuss]
Description
.jpg)
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 4 5
Sample Output
HINT
样例1中,(3 NAND 4) NADN (3 NAND 5) = 1,5 NAND 5 = 2,3和4直接可得。
Source
分析:
如果把与非操作换成异或操作应该就是裸的线性基的题目,现在问题就转化为了求与非操作下的线性基...
我们考虑通过与非操作可以得到所有的位运算:
$~A=A nand A$
$A and B=~(A nand B)$
$A orB=~((~A) and (~B))$
$A xor B=(A or B) and (A nand B)$...
然后我们发现所有的位运算,对于某些位置,如果这些位置在每个数字中都相同,那么最后的结果这些位置也是相同的...
而因为我们可以得到所有的位运算所以这些位置最后都可以为$1$,所以我们找出所有相同的位置作为线性基,一组相同的位置是线性基中的一个数...计算出线性基之后随便算一算就好了...
具体找法就是我们选取当前枚举的位置,如果一个数字当前位置为$0$那么把它取反,然后把操作之后的所有数字$and$起来,这样相同的位置一定是$1$...
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
#define int long long
using namespace std; const int maxn=1000+5; int n,k,l,r,cnt,a[maxn],b[maxn],f[maxn]; inline int calc(int x){
if(x==-1)
return -1;
int now=0,ans=0;
for(int i=1;i<=cnt;i++)
if((now|b[i])<=x)
now|=b[i],ans|=(1LL<<cnt-i);
return ans;
} inline void xor_gauss(void){
int lala=(1LL<<k)-1,now;
for(int i=k-1;i>=0;i--)
if(!f[i]){
now=lala;
for(int j=1;j<=n;j++){
if((a[j]>>i)&1)
now&=a[j];
else
now&=~a[j]&lala;
}
b[++cnt]=now;
for(int j=0;j<=i;j++)
if((now>>j)&1)
f[j]=1;
}
} signed main(void){
scanf("%lld%lld%lld%lld",&n,&k,&l,&r);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
xor_gauss();
printf("%lld\n",calc(r)-calc(l-1));
return 0;
}
By NeighThorn
BZOJ 2728: [HNOI2012]与非的更多相关文章
- BZOJ 2728: [HNOI2012]与非(位运算)
题意 定义 NAND(与非)运算,其运算结果为真当且仅当两个输入的布尔值不全为真,也就是 A NAND B = NOT(A AND B) ,运算位数不会超过 \(k\) 位, 给你 \(n\) 个整数 ...
- BZOJ 2728 HNOI2012 与非 高斯消元
题目大意:给定k位二进制下的n个数,求[l,r]区间内有多少个数能通过这几个数与非得到 首先观察真值表 我们有A nand A = not A 然后就有not ( A nand B ) = A and ...
- 【BZOJ 2728】 2728: [HNOI2012]与非 (线性基?)
2728: [HNOI2012]与非 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 813 Solved: 389 Description Inpu ...
- 【BZOJ2728】[HNOI2012]与非 并查集+数位DP
[BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述. ...
- BZOJ - 2728 与非
题意: 给定N个数,一个数k和一个范围[L,R].每个数可以使用任意次,k表示与非不超过k位.求出范围内有多少个数可以由他们的与非和表示. 题解: m个数进行NAND,最终的数二进制下某一位如果为1, ...
- BZOJ 2730: [HNOI2012]矿场搭建( tarjan )
先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...
- bzoj 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
随机推荐
- 微信公众帐号开发之一(java)
闲来没事,就记录一下微信公众平台的开发吧~ 其实微信公众平台开发没有想象中的那么困难,因为注册了微信公众平台帐号登录之后在开发者模式里有详细的文档,个人感觉介绍还是比较详细的. 微信公众平台订阅号和服 ...
- 一、Linux 安装
Linux 安装 本章节我们将为大家介绍Linux的安装. 本章节以 centos6.4 为例. centos 下载地址: 可以去官网下载最新版本:https://www.centos.org/dow ...
- 卸载Redhat 7自带的yum,安装并使用网易163源
由于redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,安装CentOS yum工具,再配置其他源,以下为详细过程:删除redhat原有的yum ...
- 数据追踪系统Zipkin 及其 Zipkin的php客户端驱动hoopak
Zipkin是Twitter的一个开源项目,是一个致力于收集Twitter所有服务的监控数据的分布式跟踪系统,它提供了收集数据,和查询数据两大接口服务.Zipkin 是一款开源的分布式实时数据追踪系统 ...
- SJTU 1077 加分二叉树
http://acm.sjtu.edu.cn/OnlineJudge/problem/1077 题意: 设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3…,n为节点 ...
- git pull免密码拉取
ssh到服务器上,原来基于public/private key pair的方法不好使了. 1.1 创建文件存储GIT用户名和密码 在%HOME%目录中,一般为C:\users\Administrato ...
- P1616 疯狂的采药
P1616 疯狂的采药 题目背景 此题为NOIP2005普及组第三题的疯狂版. 此题为纪念LiYuxiang而生. 题目描述 LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为 ...
- PostgreSql基础命令及问题总结
本章内容: 1.基本命令 基本命令 1.psql -U cdnetworks_beian -d cdnetworks_beian #-U指定用户,-d指定数据库 2.\l ...
- 11、JQuery知识点总结
1.JQuery简介 JQuery 是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作 jQuery有下列特色: 跨浏览器的DOM元素选择 DOM巡访与更改:支持CS ...
- 利用python多线程模块实现模拟接口并发
import requestsimport jsonimport threadingimport timeimport uuid class postrequests(): def __init__( ...