【xsy2272】 与运算 状压dp
题目大意:给你一个长度为$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的更多相关文章
- 状压DP详解(位运算)
前言: 状压DP是一种非常暴力的做法(有一些可以排除某些状态的除外),例如dp[S][v]中,S可以代表已经访问过的顶点的集合,v可以代表当前所在的顶点为v.S代表的就是一种状态(二进制表示),比如 ...
- 【POJ3254】Corn Fields 状压DP第一次
!!!!!!! 第一次学状压DP,其实就是运用位运算来实现一些比较,挺神奇的.. 为什么要发“!!!”因为!x&y和!(x&y)..感受一下.. #include <iostre ...
- 【状压DP】bzoj1087 互不侵犯king
一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...
- poj3254 Corn Fields (状压DP)
http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- BZOJ 1087 题解【状压DP】
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3112 Solved: 1816[Submit][ ...
- HITOJ 2662 Pieces Assignment(状压DP)
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- FZU 1025 状压dp 摆砖块
云峰菌曾经提到过的黄老师过去讲课时的摆砖块 那时百度了一下题目 想了想并没有想好怎么dp 就扔了 这两天想补动态规划知识 就去FZU做专题 然后又碰到了 就认真的想并且去做了 dp思想都在代码注释里 ...
- 状压DP
今天稍微看了下状压DP,大概就是这样子的,最主要的就是位运算, i and (1<<k)=0 意味着i状态下没有 k : i and (1<<k)>0 意味着i状态下有 ...
- POJ 3254 (状压DP) Corn Fields
基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算. 我们可以先把输入中每行的01压缩成一个整数. 判断一个状态是否有相邻1: 如果 x & (x << ...
随机推荐
- 获取POM.XML依赖的JAR包
pom.xml 文件的依赖在本地仓库中,有些情况我需要根据pom.xml 抓取所有依赖的JAR包. 这个可以通过 ant 完成这个包的抓取. <target name="maven-j ...
- CAS 单点登录 服务器整合
概述 现在企业内部的系统越来越多,如果各个应用都有自己的用户系统,那么用户将不得不要记住不同系统的用户名密码,因此独立的用户系统应运而生,各个系统之间通过单点登录的方式,这样内部只需要记住一个用户名和 ...
- 对象序列化:pickle和shelve
import pickle class DVD: def __init__(self,tilte,year=None,duration=None,director_id=None): self.tit ...
- sizeof新用法(c++11)
1.概念 1)sizeof是关键字,也是运算符,用来求对象占用空间的大小,返回字节数 2)c++11允许使用作用域运算符(::)来获取类中成员的大小,以前只允许先创建一个类的对象,通过类对象访问成员得 ...
- navigtor对象和插件检测
每一个浏览器都内置了属于自己的一套属性和方法 浏览器中navigator对象有plugins属性对象存着插件的数组 每一项包含: name 插件名称 description 插件的描述 filenam ...
- Typecho 插件开发基础
<?php /** * 标题 插件说明 * * @package 添加标题 * @author Fan * @version 1.0.0 * @link http://cnblogs.com/f ...
- Ubuntu 默认启动到命令行 12.04
源文链接:http://my.oschina.net/jackguo/blog/85706 代码: sudo gedit /etc/default/grub 引用: GRUB_CMDLINE_LINU ...
- java web 大文件下载
泽优大文件下载产品测试 泽优大文件下载控件down2,基于php开发环境测试. 开发环境:HBuilder 服务器:wamp64 数据库:mysql 可视化数据库编辑工具:Navicat Premiu ...
- #微码分享#C++变参字符串格式化函数format_string
在C和C++中,变参格式化函数虽然非类型安全,但却十分便利,因为得到广泛使用.对于常见的size_t类型要用“%zu”,ssize_t用”%zd“,int64_t用“% ”PRId64,uint64_ ...
- MySQL查询实例
单表查询查询所有列 1 SELECT * FROM product; 查询指定列 1 SELECT pro_name,price,pinpai FROM product; 添加常量列 1 SELECT ...