容易发现x nand x=not x。并且使用这个性质有x and y=not(x nand y)=(x nand y)nand(x nand y)。也就是说nand运算可以作为not和and运算使用。并且显然not和and运算可以表示nand运算,那么两者等价。事实上这就可以表示所有位运算了。

  那么考虑位运算有什么事干不了。注意到如果每个数的第i位都和第j位相同, 那么无论怎么操作这两位都是相同的。大胆猜想这也是充分的,即除了这件事其他都能干。

  这样位就被分成了很多类,每一类的取值要求相同。类似数位dp搞一发考虑第一个未达限制的是哪一位就行了。

  各种细节,调到吐血,拿过7种分数,连过了都不知道是不是数据水了,没救。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1010
#define K 60
#define ll long long
ll read()
{ll x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,k,d[K][K],fa[K];
bool flag[K];
ll l,r,num[K];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
ll calc(ll n)
{ll s=0,m=0,cnt=0;for (int i=0;i<k;i++) if (find(i)==i) cnt++;memset(flag,0,sizeof(flag));for (int i=k-1;~i;i--){if (find(i)==i) cnt--;if ((n&(1ll<<i))&&!flag[find(i)]) {s+=1ll<<cnt;flag[find(i)]=1;if ((m|=num[find(i)])>n) break;}}for (int i=0;i<k;i++)for (int j=0;j<k;j++)if (find(i)==find(j)&&((n&(1ll<<i))>0)!=((n&(1ll<<j))>0)) return s;return s+1;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj2728.in","r",stdin);freopen("bzoj2728.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read(),k=read(),l=read(),r=read();if (l>=(1ll<<k)) {cout<<0;return 0;}r=min(r,(1ll<<k)-1);for (int i=0;i<k;i++)for (int j=0;j<k;j++)d[i][j]=1;for (int i=1;i<=n;i++){ll x=read();for (int p=0;p<k;p++)for (int q=0;q<k;q++)if (((x&(1ll<<p))>0)!=((x&(1ll<<q))>0)) d[p][q]=0;}for (int i=0;i<k;i++) fa[i]=i;for (int i=0;i<k;i++)for (int j=0;j<k;j++)if (d[i][j]) fa[find(i)]=find(j);for (int i=0;i<k;i++)num[find(i)]|=1ll<<i;cout<<calc(r)-(l?calc(l-1):0);return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/9600287.html

BZOJ2728 HNOI2012与非(并查集+数位dp)相关推荐

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

    [BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2--AN,其含义如上所述.  ...

  2. 【codevs3372】选学霸,并查集+可达性DP

    选学霸 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当, ...

  3. 雷神领域(并查集真是个好东西)并查集+流氓dp

    考场上,整整看了半个小时以上的题目!!! 化简题意: 给定一个全0矩阵,一些坐标点(x,y)为1,当三个点可以构成一个直角三角形时(直角边长为整数)拓展为一个矩形,之后从(0,0)出发,求最多的占用行 ...

  4. C - BLG POJ - 1417 种类并查集加dp(背包)

    思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为"yes"的时候,我们设输入的值为x和y, ...

  5. HDU 5575 Discover Water Tank 并查集 树形DP

    题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...

  6. 【SPFA,并查集,dp】黑心商店1

    前言 自己出的一道题,但是申请的时候因为没有说明距离等于代价所以没能通过洛谷的审核 链接 https://www.luogu.org/problemnew/show/T25627 思路 大意就不详细概 ...

  7. Libre OJ 「BalticOI 2013」非回文数 数位dp

    传送门 文章目录 题意: 思路: 题意: 问[l,r][l,r][l,r]内有多少个数是非回文数,即数字中不存在连续几个数为回文数. l,r≤1e18l,r\le1e18l,r≤1e18 思路: 这么 ...

  8. 图论500题 ---- 并查集+树形dp+枚举 求解动态的最小生成树 HDU 4126

    题目链接 题目大意: 给一图,n个点,m条边,每条边有个花费,给出q条可疑的边,每条边有新的花费,每条可疑的边出现的概率相同,求不能经过原来可疑边(可以经过可疑边新的花费构建的边),注意每次只出现一条 ...

  9. 牛客练习赛61 C 四个选项(并查集、DP、排列组合)难度⭐⭐⭐

    链接:https://ac.nowcoder.com/acm/contest/5026/C 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64 ...

  10. 并查集+二分-hdu-4750-Count The Pairs

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4750 题目大意: 给一无向图,n个点,m条边,每条边有个长度,且不一样.定义f(i,j)表示从节点i ...

最新文章

  1. JS加强学习-DOM学习01
  2. Mysql练习题14-至少有5名直接下属的经理
  3. SEO优化简要工作流程
  4. Java数组实现循环队列的两种方法
  5. 部署LAMP-WordPress站点上线
  6. RxSwift之UI控件UIGestureRecognizer扩展的使用
  7. vnc用户名 查看linux_vnc用户名未被识别,5步教你如何解决vnc用户名未被识别
  8. python 程序运行计时 动态,在python中运行计时器几分钟
  9. 解析时分秒_三年级上册,数学期中复习卷(含详细答案解析),有效提分,收藏...
  10. sql 在存储过程中使用事务(转)
  11. 关于Java单例模式中懒汉式和饿汉式的两种类创建方法
  12. SSM框架-实现Mybatis分页功能-foreknow_cms
  13. “恐怖”的阿里一面,我究竟想问什么
  14. 【2022 CCPC 华为云计算挑战赛】1005 带权子集和 (NTT 优化dp)
  15. 一次让人晕到吐血的接包经历
  16. 三国演义人物词频统计-4
  17. 关于Office365邮箱附件大小限制问题
  18. 进行大数据测试需要关注那些测试点?
  19. 8 款浏览器兼容性测试工具介绍,需要的赶紧收藏吧
  20. ORACLE各种对象、概念及关系整理(一文读懂)

热门文章

  1. 第八章 (二)贪心法
  2. php imagick下载,PHP安装imagemagick扩展imagick
  3. php之mvc设计模式的原理和实现
  4. springboot2.x 集成百度 uidgenerator
  5. java中eq、ne、gt、lt、ge、le分别代表含义
  6. ZT:Linux上安装JDK,最准确
  7. webpack最佳入门实践系列(08)
  8. inline-block和float
  9. linux中配置Java环境
  10. 我的记事本(VB6)