【BZOJ2728】[HNOI2012]与非 并查集+数位DP
【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 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 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...
随机推荐
- zabbix通过snmp监控linux主机
1.安装net-snmp [root@db01 ~]# yum install -y net-snmp 2.修改配置文件 [root@db01 ~]# vim /etc/snmp/snmpd.conf ...
- android开发常用地址
一. android市场占用率的url http://developer.android.com/about/dashboards/ 二. ADT下载 下载地址是:http://developer.a ...
- postman里面的mockserver使用方法
转载:http://blog.csdn.net/Cloud_Huan/article/details/78326159 首先说下mockserver是干啥的,从英文翻译理解就是模拟一个服务器,通俗点说 ...
- 【转载】Loadrunner实现Android / IOS 手机APP压力测试
随着手机APP用户量的增大,大的手机APP一般都需要进行压力测试,这几天用了loadrunner 12进行了手机APP的压力测试,整理了下,大家可以参考参考怎样给Andorid / IOS手机APP进 ...
- UltraISO 9.6.5.3237
注册信息: 用户名:Guanjiu 注册码:A06C-83A7-701D-6CFC
- poj 1390 Blocks (经典区间dp 方块消除)
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4250 Accepted: 1704 Descriptio ...
- Mac环境下反编译apk
0,工具汇总 我们反编译apk主要使用下面三个工具 apktool:用于获取资源文件 dex2jar:获取源文件jar包 JD-GUI:反编译源文件jar包查看源码 找这些工具时折腾了我点时间.如今把 ...
- Nigix加入Hello World模块
详细资料:<深入理解Nginx> 1.编写第三方模块 建立文件夹hello,里面有两个文件: ngx_http_mytest_module.c #include <ngx_confi ...
- BNU 34990 Justice String (hash+二分求LCP)
思路:枚举第一个字符串的位置,然后枚举最长公共前缀的长度,时间即会下降-- #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...
- sprint3 【每日scrum】 TD助手站立会议第八天
站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 调整闹钟和整个项目的显示效果,最后做出了微信界面滑动的显示效果 整合原来做过的功能,并做相应的改进,整合其他的功能 在界面的设计和用户交互上始 ...