【BZOJ2728】[HNOI2012]与非 并查集+数位DP
【BZOJ2728】[HNOI2012]与非
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直接可得。
题解:一开始想用逻辑分析的角度来处理这道题,发现对于本蒟蒻来说实在是处理不了,还是感性理解比较适合我~
我们用一个数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;
}
【BZOJ2728】[HNOI2012]与非 并查集+数位DP的更多相关文章
- 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运算使用 ...
- 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 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...
随机推荐
- 自动生成logo的网址
1.https://www.logaster.com/logo/
- win7/win10+vs2015+pcl1.8.0详细配置方案;
参考网友的资料整理为更详细的解决方案 一.下载相关文件 1.下载PCL-1.8.0-AllInOne-msvc2015-win64.exe.属性表和PDB和测试pcd文件rabbit.pcd,其中,属 ...
- object references an unsaved transient instance - save the transient instance before flushing异常问题处理
一.异常:org.hibernate.TransientObjectException: object references an unsaved transient instance - save ...
- ElasticSearch refresh和flush的理解
在索引数据的时候,要保证被索引的文档能够立即被搜索到,就要涉及到_refresh 和_flush这两个方法. 1.fresh 当索引一个文档,文档先是被存储在内存里面,默认1秒后,会进入文件系统缓存, ...
- 【iOS开发-55】图片轮播案例:scrollView的分页、滚动栏、利用代理控制定时器和Page Control以及多线程问题
案例: (1)用storyboard布局,这里用了三样东西. --UIScrollView就是我们准备存放滚动图片的容器. --Page Control就是控制页数的那几个小点点.能够设置有多少个点. ...
- log4j输出日志到flume
现需要通过log4j将日志输出到flume,通过flume将日志写到文件或hdfs中 配置flume-config文件 将日志下沉至文件 a1.sources = r1 a1.sinks = k1 a ...
- 【云计算】WAF简介、功能特性、部署方式等
之前写了一篇<WAF防御能力评测及工具>,是站在安全运维人员选型WAF产品的角度来考虑的(优先从测试角度考虑是前职业病,毕竟当过3年游戏测试?!).本篇文章从WAF产品研发的角度来YY如何 ...
- Java之基本类库学习
JAVA基本类库: (一),输入相关 main(String[] args):设置输入参数 输入类:Scanner:Scanner sc=new Scanner(System.in); (二),系统相 ...
- sql 查询重复的数据
select * from yryz_role_partner where user_id in (select user_id from yryz_role_partner group by use ...
- Haproxy 8种算法+Session共享
Haproxy有8种负载均衡算法(balance),分别如下: 1.balance roundrobin # 轮询,软负载均衡基本都具备这种算法 2.balance static-rr # 根据权重, ...