题目大意:给你一个长度为$n$的序列$a$,我们定义$f_i$表示序列$a$前i项一次进行按位与运算后的值。

我们认为一个序列的价值为$\sum_{i=1}^{n}f_i$,现在你要重新排列序列$a$,使得序列的价值最大。

数据范围,$1≤a_i,n≤10^6$

我们考虑$dp$。

不难发现,若序列中存在数$x$和数$y$,满足$x\&y==x$,那么将$y$放在$x$前面显然是会更优的。

设$cnt[i]$表示序列$a$中,有多少个数$k$,满足$i\&k==i$(此处&表示按位与)

我们$f[i]$表示以i结尾的序列的最大值是多少,那么显然答案为$\max\limits_{0≤i<2^{20}}f[i]$

不难发现有$f[i]=\max\limits_{i\&k==i} f[k]+(cnt[k]-cnt[i])$。

如果说直接转移的话复杂度显然是$O(n^{\log_2^3})$的,这么搞只能过$70%$的数据。

所以要稍微考虑下转移的性质,我们只需要转移满足$k=i+2^j$的$k$即可。

这样时间复杂度就可以优化到$O(n\log\ n)$了。

 #include<bits/stdc++.h>
#define N 20
#define M (1<<N)
using namespace std;
int cnt[M]={}; long long f[M]={},ans=;
int main(){
for(int n,x=scanf("%d",&n);n;n--) scanf("%d",&x),cnt[x]++;
for(int j=;j<N;j++)
for(int i=M-(<<(j+));i>=;i--)
if((i&(<<j))==)
cnt[i]+=cnt[i+(<<j)];
for(int i=M-;~i;i--){
for(int j=;j<N;j++)
if((i&(<<j))==){
f[i]=max(f[i],f[i+(<<j)]+1LL*i*(cnt[i]-cnt[i+(<<j)]));
ans=max(ans,f[i]);
}
}
cout<<ans<<endl;
}

【xsy2272】 与运算 状压dp的更多相关文章

  1. 状压DP详解(位运算)

    前言: 状压DP是一种非常暴力的做法(有一些可以排除某些状态的除外),例如dp[S][v]中,S可以代表已经访问过的顶点的集合,v可以代表当前所在的顶点为v.S代表的就是一种状态(二进制表示),比如 ...

  2. 【POJ3254】Corn Fields 状压DP第一次

    !!!!!!! 第一次学状压DP,其实就是运用位运算来实现一些比较,挺神奇的.. 为什么要发“!!!”因为!x&y和!(x&y)..感受一下.. #include <iostre ...

  3. 【状压DP】bzoj1087 互不侵犯king

    一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...

  4. poj3254 Corn Fields (状压DP)

    http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  5. BZOJ 1087 题解【状压DP】

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3112  Solved: 1816[Submit][ ...

  6. HITOJ 2662 Pieces Assignment(状压DP)

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  7. FZU 1025 状压dp 摆砖块

    云峰菌曾经提到过的黄老师过去讲课时的摆砖块 那时百度了一下题目 想了想并没有想好怎么dp 就扔了 这两天想补动态规划知识 就去FZU做专题 然后又碰到了 就认真的想并且去做了 dp思想都在代码注释里 ...

  8. 状压DP

    今天稍微看了下状压DP,大概就是这样子的,最主要的就是位运算, i and (1<<k)=0 意味着i状态下没有 k : i and (1<<k)>0 意味着i状态下有 ...

  9. POJ 3254 (状压DP) Corn Fields

    基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算. 我们可以先把输入中每行的01压缩成一个整数. 判断一个状态是否有相邻1: 如果 x & (x << ...

随机推荐

  1. Bayes’s formula for Conditional Probability

    Conditional Probability Example:In a batch, there are 80% C programmers, and 40% are Java and C prog ...

  2. Promise.all函数的使用

    Promise.all([this.getCity('guess'),this.getCity('hot'),this.getCity('group')]).then(res=>{ // con ...

  3. HDU 5212 Code (莫比乌斯反演)

    题意:给定上一个数组,求 析: 其中,f(d)表示的是gcd==d的个数,然后用莫比乌斯反演即可求得,len[i]表示能整队 i 的个数,可以线性筛选得到, 代码如下: #pragma comment ...

  4. 安卓 build/core/Makefile 以及main.mk

    android make 系统总共分为四层 arch board device product 在各个字android.mk文件中引用的定义都存放在./build/core/下!比如android.m ...

  5. (转)忘记wamp-mysql数据库root用户密码重置方法

    转自:http://www.jb51.net/article/28883.htm 1.打开任务管理器,结束进程  mysqld-nt.exe . 2.运行命令窗口 1)进行php服务管理器安装目录中的 ...

  6. 软工网络15团队作业4——Alpha阶段敏捷冲刺(一)

    第 1 篇 Scrum 冲刺: 各个成员在 Alpha 阶段认领的任务 成员      任务 预期任务量/小时 曾艺佳 学习模块:单词及其释义      单词发音     例句学习     添加笔记 ...

  7. 02:OC和C对比

    1.源文件对比 C语言中常见源文件.h头文件,.c文件 文件扩展名 源类型 .h 头文件,用于存放函数声明 .c C语言源文件,用于实现头文件中声明的方法 OC中的源文件.h头文件,.m与.mm的实现 ...

  8. express4.x socket

    在这个版本下使用socket,配置比较麻烦. 使用实例:http://www.open-open.com/lib/view/open1402479198587.html 配置文件:BarOrderPr ...

  9. 计算日期差(Python实现)

    class Solution: def Days(self,year,month,day): if (year%4==0 and year%100!=0) or year%400==0: monthl ...

  10. Linux查看History记录加时间戳小技巧

    Linux查看History记录加时间戳小技巧 熟悉bash的都一定知道使用history可以输出你曾经输入过的历史命令,例如[root@servyou_web ~]# history | more ...