【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 NAND 4) NADN (3 NAND 5) = 1,5 NAND 5 = 2,3和4直接可得。

题解:一开始想用逻辑分析的角度来处理这道题,发现对于本蒟蒻来说实在是处理不了,还是感性理解比较适合我~

我们用一个数nand它本身,就得到了这个数取非,将两个取非的数nand一起自然就是与,有了非和与自然就有了或,有了与,非,或也自然就有了异或,所以只用nand显然是可以表示所有逻辑运算的。

不过这样就能表示所有的数了吗?显然不能,发现如果集合中所有的数的某几位是一样的话,无论怎么运算这几位肯定还是一样的,所以我们只需要统计有多少数的这几位都是一样的就行了。然后我们用并查集处理出有哪些位是一样的,剩下的就交给数位DP就行了(又是INF的细节)。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
int n,k,tot,s[70];
ll ans,v[1010];
int f[70],mark[70];
int find(int x)
{
return (f[x]==x)?x:(f[x]=find(f[x]));
}
bool check(int a,int b)
{
for(int i=1;i<=n;i++) if(((v[i]>>a-1)^(v[i]>>b-1))&1) return 0;
return 1;
}
ll calc(ll x)
{
if(++x>=(1ll<<k)) return (1ll<<s[k]);
int i;
ans=0;
memset(mark,-1,sizeof(mark));
for(i=k;i;i--)
{
if(x&(1ll<<i-1))
{
if(mark[f[i]]!=1) ans+=1ll<<s[i-1];
if(f[i]==i) mark[i]=1;
if(mark[f[i]]==0) break;
}
else
{
if(f[i]==i) mark[i]=0;
if(mark[f[i]]==1) break;
}
}
return ans;
}
int main()
{
int j;
ll i,l,r;
scanf("%d%d%lld%lld",&n,&k,&l,&r);
for(i=1;i<=n;i++) scanf("%lld",&v[i]);
for(i=1;i<=k;i++)
{
f[i]=i;
for(j=i-1;j;j--) if(check(i,j)&&find(i)!=find(j)) f[f[j]]=f[i];
}
for(i=1;i<=k;i++)
{
s[i]=s[i-1];
if(find(i)==i) s[i]++;
}
printf("%lld",calc(r)-calc(l-1));
return 0;
}

最新文章

  1. 你必须知道的Microsoft SQL Server一
  2. 《A Convolutional Neural Network Cascade for Face Detection》
  3. ADO.net 连接字符串中的 |DataDirectory| 是什么
  4. 【CSS】理解CSS
  5. 关于 webapi ajax进度条信息设置
  6. POJ3467(预处理)
  7. Responsive Design in 3 Steps
  8. ubuntu12.04+fuerte 下跑通lsd-slam——数据集
  9. UML类图中的关系和表示方法
  10. mui开发app之多图压缩与上传(仿qq空间说说发表)
  11. Woody的Python学习笔记1
  12. MySQL多Text字段报8126错误(解决过程)
  13. 使用 coverlet 查看.NET Core应用的测试覆盖率
  14. Bootstrap-table 部分浏览器显示不出来
  15. Xtoken
  16. Python学习笔记 ---第三章
  17. Python学习笔记9-多线程和多进程
  18. Leetcode 869. 重新排序得到 2 的幂
  19. C# 获取文件的MIME类型
  20. (转)How to Use Elasticsearch, Logstash, and Kibana to Manage MySQL Logs

热门文章

  1. 用android连小米手机做profiling
  2. Win7 Visual Studio 2008如何注册
  3. Layer 初始
  4. ddmrp
  5. 娓娓道来c指针 (2)内存分配
  6. java读取clob字段的几种方法
  7. discuz密码生成
  8. c#实现记事本
  9. Hadoop 配置及hadoop HA 的配置
  10. idea新建项目打包 ,运行jar,并放入maven仓库