【JZOJ 4937】 与运算
来源:互联网 发布:阿里云三年五折 编辑:程序博客网 时间:2024/06/15 19:22
Description
Analysis
因为是与运算,所以很容易想到的套路就是用二进制
可以设f[i]表示当前每一位二进制状态为i,然后状压DP
枚举每个数转移,设cnt[i]表示有多少个数满足and i=i(即i中若某一位为1则数中该位也为1)
那么
cnt怎么求,我们可以分治,比如:
000 001 010 011 | 100 101 110 111
左边的第i个数
这样cnt求出来是nlogn的,但是转移是n^2的
考虑优化,贪心想,每次只把一个1变成0
这样显然是对的
复杂度nlogn
Code
#include<cstdio>#include<cmath>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,b,a) for(int i=b;i>=a;i--)using namespace std;typedef long long ll;const int N=1048600;int n,m,_2[21],a[N];ll f[N],cnt[N];void dfs(int l,int r){ if(l==r) return; int mid=(l+r)>>1; fo(i,0,mid-l) cnt[l+i]+=cnt[mid+1+i]; dfs(l,mid);dfs(mid+1,r);}int main(){ freopen("and.in","r",stdin); freopen("and.out","w",stdout); _2[0]=1; fo(i,1,20) _2[i]=_2[i-1]*2; scanf("%d",&n); int mx=0; fo(i,1,n) { scanf("%d",&a[i]); cnt[a[i]]++; mx=max(mx,a[i]); } int s=a[1]; fo(i,2,n) s&=a[i]; m=log2(mx)+1; dfs(0,_2[m]-1); fd(i,_2[m]-1,0) { fo(j,0,m-1) if(i&_2[j]) { int i1=i-_2[j]; f[i1]=max(f[i1],f[i]+i1*(cnt[i1]-cnt[i])); } } printf("%lld",f[s]); return 0;}
0 0
- 【JZOJ 4937】与运算
- 【JZOJ 4937】 与运算
- JZOJ 4937【GDKOI2017模拟1.12】与运算
- JZOJ 4937 【GDKOI2017模拟1.12】与运算
- 【JZOJ 3427】归途与征程
- [JZOJ 3427] 归途与征程
- JZOJ 4866 禅与园林艺术
- jzoj 3427 归途与征程
- JZOJ 5253. 排列与交换
- 阶梯Nim 与【JZOJ 5500】 营养餐
- &“与”运算
- 与运算
- [ 模运算 ] 与 [ 模取幂运算 ]
- [ 模运算 ] 与 [ 模取幂运算 ]
- [ 模运算 ] 与 [ 模取幂运算 ]
- Matlab运算符与运算
- 赋值运算与位运算
- 数值运算与运算符
- 拓补排序 ACM经典排序 算法精讲
- theano 的问题:import no module named gof
- reactjs设计架构---Flux 从愣逼到哇哦
- 8.C#:[Serializable]的作用
- 【bzoj1458】士兵占领 最大流
- 【JZOJ 4937】 与运算
- Struts2系统结构及运行原理
- Amazon Alexa系列介绍(1)--综述
- 129. Sum Root to Leaf Numbers--注意非递归的方法
- CodeForces 581C - Developing Skills(模拟)
- Listview缓存机制分析(四)
- windows和android调用第三方C++库(静态库lib、动态库dll)
- 算法提高 大数加法
- NOIP2012 提高组 复赛 day1 game 国王游戏 再见