bzoj 2728 与非 【找规律】 【位运算】 【数位dp】

原创 2015年11月20日 23:18:17

通过与非运算可以组合出and和not,然后and和not可以组合所有的逻辑运算。

所以只要有可能,没有表示不出来的数。但是如果所有数都满足st[i]=st[j] 那么这两位无论如何都相等。

并查集维护所有相等的类别,数位dp

还是不太熟练。

01数位dp的本质是枚举所有的非0位,假设它是0,更新答案,然后把它设为1,求之后的答案。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>

#define ll long long
#define inf 1e9
#define eps 1e-10
#define md
#define N 100010
using namespace std;
int mark[N],fa[N];
ll a[N];
bool vis[N];
int K;
int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
int getnum(int x)
{
	memset(vis,0,sizeof(vis));
	for (int i=x;i>=0;i--) vis[find(i)]=1;
	//for (int i=0;i<=x;i++) printf("%d %d  ",fa[i],vis[i]); 
	int ans=0;
	for (int i=0;i<=x;i++) ans+=vis[i];
	return ans;
}
	
ll dp(ll x)
{
	if (x<0) return 0;
	memset(mark,-1,sizeof(mark));
	ll ans=0; int t=getnum(K-1); //printf("t %d\n",t);
	if ((x>>K)) return 1ll<<t;
	for (int k=K-1;k>=0;k--)
	{
		int f=find(k);
		if ((x>>k)&1)
		{
			if (mark[f]==1) continue;
			if (mark[f]==-1)
			{
				mark[f]=1; t--;
				ans+=(1ll<<t);
			}
			else if (mark[f]==0)
			{
				ans+=(1ll<<t);
				return ans;
			}
			if ((!k)&&mark[f]==1) ans++;
		}
		else
		{
			if (mark[f]==-1)
			{
				mark[f]=0; t--;
			}
			else if (mark[f]==1) return ans;
			if ((!k)&&mark[f]==0) ans++;
		}
	}
	return ans;
}

int main()
{
#ifndef ONLINE_JUDGE
	freopen("data.in","r",stdin); //freopen("data.out","w",stdout);
#endif
	int n; ll l,r;
	scanf("%d%d%lld%lld",&n,&K,&l,&r);
	for (int i=1;i<=n;i++)
	  scanf("%lld",&a[i]);
	for (int i=0;i<K;i++) fa[i]=i;
	for (int i=0;i<K;i++)
	  for (int j=i+1;j<K;j++)
	  {
	  	bool bo=1;
	  	for (int k=1;k<=n;k++)
	  	  if (((a[k]>>i)&1)!=((a[k]>>j)&1))
	  	  {
	  	  	bo=0;
	  	  	break;
	  	  }
	  	if (bo)
	  	{
	  		int f1=find(i),f2=find(j);
	  		if (f1!=f2) fa[f1]=f2;
	  	}
	  }
	//printf("%lld %lld\n",dp(r),dp(l-1));
	printf("%lld\n",dp(r)-dp(l-1));
	return 0;
}
	

相关文章推荐

【HNOI2012】bzoj2728 与非

位运算+数位dp
  • sdfzyhx
  • sdfzyhx
  • 2017年02月01日 16:07
  • 189

BZOJ 2728 HNOI2012 与非 高斯消元

题目大意:给定k位二进制下的n个数,求[l,r]区间内有多少个数能通过这几个数与非得到 首先观察真值表 我们有A nand A = not A 然后就有not ( A nand B ) = A a...
  • PoPoQQQ
  • PoPoQQQ
  • 2014年10月14日 15:23
  • 1919

hdu 4722 Good Numbers(找规律,记忆化搜索,数位dp)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4722 解题思路: 题目大意: 给你两个数a,b(a 算法思想: 先枚举一下0~2...

【BZOJ3227】红黑树,打表找规律/DP

.

BZOJ(本校) 3048 染色 - dp&递推找规律

【问题描述】 最近大大很happy,她制作了一些小旗,小旗都排成一列。现在她有四种颜色,分别为R,B,W,Y。突发奇想的大大决定出个问题考考你。她想知道,n面小旗染色有多少种不同的方案数。这...

CodeForces 558C Amr and Chemistry (位运算,数论,规律,枚举)

Codeforces 558C 题意:给n个数字,对每个数字可以进行两种操作:num*2与num/2(向下取整),求:让n个数相等最少需要操作多少次。 分析: 计算每个数的二进制公共前缀. 枚...

codeforces215E(数位DP,规律水过)

地址:http://codeforces.com/contest/215/problem/E E. Periodical Numbers time limit pe...

【bzoj3668】[Noi2014]起床困难综合症 位运算

Description21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳。作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争。通过研究相关文献,他找到...
  • LOI_DQS
  • LOI_DQS
  • 2016年01月09日 10:19
  • 325

BZOJ 3668 [Noi2014]起床困难综合症 贪心+位运算

BZOJ 3668 [Noi2014]起床困难综合症 贪心+位运算
  • wzq_QwQ
  • wzq_QwQ
  • 2015年05月10日 21:42
  • 887

【bzoj2284】【SDOI2011】贪吃蛇【搜索】【位运算】【卡常大法好】

这道题真是太精妙了…… 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2284 首先这题棋盘的范围是15不是12。 本来原题是有spec...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bzoj 2728 与非 【找规律】 【位运算】 【数位dp】
举报原因:
原因补充:

(最多只允许输入30个字)