BZOJ2728 HNOI2012与非(并查集+数位dp)
容易发现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=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),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=,m=,cnt=;
for (int i=;i<k;i++) if (find(i)==i) cnt++;
memset(flag,,sizeof(flag));
for (int i=k-;~i;i--)
{
if (find(i)==i) cnt--;
if ((n&(1ll<<i))&&!flag[find(i)])
{
s+=1ll<<cnt;
flag[find(i)]=;
if ((m|=num[find(i)])>n) break;
}
}
for (int i=;i<k;i++)
for (int j=;j<k;j++)
if (find(i)==find(j)&&((n&(1ll<<i))>)!=((n&(1ll<<j))>)) return s;
return s+;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2728.in","r",stdin);
freopen("bzoj2728.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),k=read(),l=read(),r=read();
if (l>=(1ll<<k)) {cout<<;return ;}
r=min(r,(1ll<<k)-);
for (int i=;i<k;i++)
for (int j=;j<k;j++)
d[i][j]=;
for (int i=;i<=n;i++)
{
ll x=read();
for (int p=;p<k;p++)
for (int q=;q<k;q++)
if (((x&(1ll<<p))>)!=((x&(1ll<<q))>)) d[p][q]=;
}
for (int i=;i<k;i++) fa[i]=i;
for (int i=;i<k;i++)
for (int j=;j<k;j++)
if (d[i][j]) fa[find(i)]=find(j);
for (int i=;i<k;i++)
num[find(i)]|=1ll<<i;
cout<<calc(r)-(l?calc(l-):);
return ;
}
BZOJ2728 HNOI2012与非(并查集+数位dp)的更多相关文章
- 【BZOJ2728】[HNOI2012]与非 并查集+数位DP
[BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述. ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- BZOJ_2443_[Usaco2011 Open]奇数度数 _并查集+树形DP
BZOJ_2443_[Usaco2011 Open]奇数度数 _并查集. Description 奶牛们遭到了进攻!在他们的共和国里,有N(1 <= N <=50,000)个城市,由M(1 ...
- poj 1417(并查集+简单dp)
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2087 Accepted: 640 Descrip ...
- C - BLG POJ - 1417 种类并查集加dp(背包)
思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为“yes”的时候,我们设输入的值为x和y,当x为天使是则由题可 ...
- poj1417(带权并查集+背包DP+路径回溯)
题目链接:http://poj.org/problem;jsessionid=8C1721AF1C7E94E125535692CDB6216C?id=1417 题意:有p1个天使,p2个恶魔,天使只说 ...
- HDU 5575 Discover Water Tank 并查集 树形DP
题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...
- HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- P2700逐个击破(并查集/树形dp)
P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...
随机推荐
- Android 多用户多缓存的简单处理方案
需求:1.在缓存中记录用户登录信息.例如:用户名,密码 2.记录用户操作数据.例如:是否记住用户名密码.设置7天内自动登录等 简单设计:1)使用sqlite设计一张用户数据表,有用户名.密码.操作数据 ...
- 3D Touch开发技巧的笔记
iPhone6s以及iPhone6s plus搭载iOS9,有一个新功能叫做3D Touch,这个功能有很大的用处,关键是要会用,这给交互方式又多了一个新的选择和思考,比如说游戏中的额外控制选项.绘图 ...
- AI Summit(2018.07.19)
AI Summit 时间:2018.07.19地点:北京丽都皇冠假日酒店
- 20155321 《网络攻防》 Exp5 MSF基础应用
20155321 <网络攻防> Exp5 MSF基础应用 基础问题 用自己的话解释什么是exploit,payload,encode 关于exploit,我觉得exploit是利用一些工具 ...
- 20155339平措卓玛 Exp2 后门原理与实践
20155339平措卓玛Exp2 后门原理与实践 基础问题 (1)例举你能想到的一个后门进入到你系统中的可能方式? 答:下载并安装某个程序,这个程序可以正常的并且完整的为我们提供服务,但是在开发改程序 ...
- Luogu P1972 [SDOI2009]HH的项链
很清新自然凶猛的数据结构题,都是套路啊 我们可以考虑离线做,先把区间按右端点从小到大排序 首先注意到一种贝壳如果在一段中出现超过1次,那么它在前面或后面就无关紧要了 举一个例子: 对于数列1 2 3 ...
- python 实现分治法的几个例子
分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. 3) 利用该问题分解出的子 ...
- OpenCV实战:人脸关键点检测(FaceMark)
Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author: Amusi Date: 2018-03-20 ...
- libgdx学习记录12——圆角矩形CircleRect
libgdx提供了ShapeRenderer这个工具,用它可以画点.画线.画圆.画矩形.画椭圆.画扇形,但是没有提供画圆角矩形的方法. 刚开始自己尝试分成8端,4端画直线,4端画扇形,发现多了半径几部 ...
- 如何设计一个异步Web服务——接口部分
需求比较简单,提供一个异步Web服务供使用者调用.比如说,某应用程序需要批量地给图片加lomo效果.由于加lomo效果这个操作非常消耗CPU资源,所以我们需要把这个加lomo效果的程序逻辑放到一台单独 ...