[HNOI2012]与非 解题报告
来源:互联网 发布:php和前端那个难 编辑:程序博客网 时间:2024/05/22 05:03
这题其实主要考察的就是反演律。
not(a and a)=not a
not(not a and not b)=a or b
not(not a or not b)=a and b
所以实际上,用nand就可以构造出所有位运算。实际上,对于二元位运算真值表的
就等于not A and not B or A and not B.
就是先一行一行and,然后or起来就行(结果是0的可以不用管)。
那么显然,如果有两位在所有数中相同,那么无论如何运算,这两位都必然是相同的。如果我们把它俩之间连一条边的话,那么就会构成若干互不相连的团。
所以我们不禁猜想,団与团之间是没有影响的,假如说有m个团,那么
那么我们考虑如何构造。首先我们对于第i个团,我们构造
然后我们用数位dp来处理
这样时间复杂度就是
#include<cstdio>#include<iostream>using namespace std;#include<cstdlib>#include<cmath>#include<cstring>typedef long long LL;LL A[1005],bset[65];int K;bool flag[65];LL query(LL n){ if(n<0)return 0; LL ans=0; int sum=0; for(int j=K;j--;)sum+=(bool)bset[j]; for(int j=K;j--;) if(bset[j]){ --sum; if(bset[j]<=n){ n-=bset[j]; ans|=1LL<<sum; //cout<<"Get:"<<bset[j]<<" "<<(1<<sum)<<endl; } } return ans+1;}int main(){ freopen("bzoj_2728.in","r",stdin); freopen("bzoj_2728.out","w",stdout); int N,i,j,k; LL L,R; cin>>N>>K>>L>>R; if(L>=1LL<<K){ puts("0"); return 0; } R=min(R,(1LL<<K)-1); for(i=N;i--;)cin>>A[i]; for(j=K;j--;) if(!flag[j]){ bset[j]=(1LL<<K)-1; for(i=N;i--;) if(A[i]>>j&1)bset[j]&=A[i]; else bset[j]&=~A[i]; for(k=j;~k;--k) if(bset[j]>>k&1) flag[k]=1; } cout<<query(R)-query(L-1)<<endl;}
总结:
对于位运算,往往打包处理会有奇效!
0 0
- [HNOI2012]与非 解题报告
- HNOI2012解题报告
- [HNOI2012]矿场搭建 解题报告
- luogu解题报告:HNOI2012永无乡
- bzoj2728: [HNOI2012]与非
- 【HNOI2012】bzoj2728 与非
- BZOJ 2728: [HNOI2012]与非
- bzoj 2728: [HNOI2012]与非
- BZOJ 2728: [HNOI2012]与非
- BZOJ 2728 HNOI2012 与非 高斯消元
- codeforces解题报告与总结
- Java与C++ 解题报告
- 【Code_Vs_1014】解题报告与总结
- POJ1330 Nearest Common Ancestors 非lca pascal 解题报告
- 解题报告 ch1 排序与搜素
- 算法分析与设计解题报告
- (解题报告)HDU2007---平方和与立方和
- 10.25.2017 考试总结与解题报告
- [3.16]竞赛入门经典,习题2-6
- ORA-39143: 转储文件可能是原始的导出转储文件
- Cocoa Touch事件处理流程--响应者链
- java的文件操作
- (四)ExtJs自定义弹出框(show)
- [HNOI2012]与非 解题报告
- 欢迎使用CSDN-markdown编辑器
- 从头认识设计模式-策略模式-01-原始应用场景
- UESTC 758 P酱的冒险旅途
- 再谈百度:KPI、无人机,以及一个必须给父母看的案例
- iOS NSObject
- Python核心编程读书笔记0
- PHP安全有帮助的一些函数
- 开源 java CMS - FreeCMS2.4 操作日志