BZOJ4676 Xor-Mul棋盘
题目大意懒得写了,题目说的挺明白的了
题解
主要的难点在于异或意义下的最大值和很玄学,但不难发现这道题中让你定义的$D_{i,j}$只参与异或运算,所以我们可以逐位进行讨论。所以我们每一位就只有$0$和$1$两种状态,由于$n$很小,所以我们可以把每一列的$01$情况压成二进制状态。由于是在异或意义下,我们可以预处理这一位上每一列每个状态的$A$的$01$情况,每一列的每一个状态的$\sum B_{i,j}$和每两列之间每个状态的比边权和,以及每一列每个状态纵向的边的贡献,直接从左向右递推即可,转移时通过异或运算直接计算出转移时新产生的增量。
复杂度$O(2^{2n}m\log_2 10^6+2^nnm)$
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 20020
#define INF 2000000000000000000ll
using namespace std;
int read(){
int nm=0,fh=1; int cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
int n,m,A[6][M],B[6][M],E[6][M],V[6][M],K[M][40];
int val[M][40],G[M][40],S[M],len[M],MAXN;
LL F[M][40],ans;
void init(int x,int now,int sta,int cst){
if(now==n){G[x][sta]=cst;return;} init(x,now+1,sta,cst);
init(x,now+1,sta|(1<<now),cst+E[now][x]);
}
void dfs(int x,int now,int sta,int cst){
if(now==n){val[x][sta]=cst;return;} dfs(x,now+1,sta,cst);
dfs(x,now+1,sta|(1<<now),cst+B[now][x]);
}
int main(){
n=read(),m=read(),memset(F,0x3f,sizeof(F)),MAXN=(1<<n);
for(int i=0;i<n;i++) for(int j=1;j<=m;j++) A[i][j]=read();
for(int i=0;i<n;i++) for(int j=1;j<=m;j++) B[i][j]=read();
for(int i=0;i<n;i++) for(int j=1;j<m;j++) E[i][j]=read();
for(int i=0;i<n-1;i++) for(int j=1;j<=m;j++) V[i][j]=read();
for(int i=1;i<=m;i++){
if(i<m) init(i,0,0,0); dfs(i,0,0,0),len[i]=read();
for(int ss=0;ss<MAXN;ss++){
for(int j=0;j<n-1;j++) K[i][ss]+=(((ss>>j)^(ss>>(j+1)))&1)*V[j][i];
if((ss^(ss>>(n-1)))&1) K[i][ss]+=len[i];
}
}
for(int k=0;k<21;k++){
int ct=0; memset(S,0,sizeof(int)*(m+1));
for(int i=1;i<=m;i++){
for(int j=0;j<n;j++) S[i]|=(((A[j][i]>>k)&1)<<j); ct+=(S[i]>0);
} if(!ct) continue;
for(int ss=0;ss<MAXN;ss++) F[1][ss]=val[1][S[1]^ss]+K[1][ss];
for(int i=2;i<=m;i++){
for(int sta=0;sta<MAXN;sta++){
LL res=INF; F[i][sta]=val[i][S[i]^sta]+K[i][sta];
for(int last=0;last<MAXN;last++) res=min(res,G[i-1][sta^last]+F[i-1][last]);
F[i][sta]+=res;
}
} LL res=INF;
for(int i=0;i<MAXN;i++) res=min(res,F[m][i]);
ans+=(res<<k);
} printf("%lld\n",ans); return 0;
}
BZOJ4676 Xor-Mul棋盘的更多相关文章
- 【BZOJ4676】Xor-Mul棋盘 拆位+状压DP
[BZOJ4676]Xor-Mul棋盘 Description 一个n*m的棋盘,左上角为(1,1),右下角为(n,m).相邻的2点之间有连边(如下图中实线)特殊地,(1,i)与(n,i)也连有一条边 ...
- MySQL Out-of-Band 攻击
概述 当涉及到MSSQL与Oracle时,Out-of-Band 注入是非常好的方式.但我注意到MySQL注入的情况并非如此,于是我准备以自己在SQL注入方面的经验做相关的研究.我们可以利用诸如loa ...
- [TJOI2015] 棋盘
Description 为了提高智商,ZJY去新世界旅游了.可是旅游过后的ZJY杯具的发现要打开通往原来世界的门,必须要解开门上面画的谜题.谜题是这样的:有个\(n\)行\(m\)列的棋盘,棋盘上可以 ...
- 【洛谷】【搜索(dfs)】P3956 棋盘
题目传送门:戳 题目描述: 有一个 \(m * m\) 的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色 ...
- [luogu P1169] [ZJOI2007]棋盘制作
[luogu P1169] [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的 ...
- UVA 12716 GCD XOR (异或)
题意:求出[1,n]中满足gcd(a,b)=a xor b,且1<=a<=b<=n的对数 题解:首先a xor b = c,则a xor c = b,而b是a的约数,则可以使用素数筛 ...
- 【CZY选讲·Hja的棋盘】
题目描述 Hja特别有钱,他买了一个×的棋盘,然后Yjq到这个棋盘来搞事.一开始所有格子都是白的,Yjq进行次行操作次列操作,所谓一次操作,是将对应的行列上的所有格子颜色取反.现在Yjq希望搞事之后 ...
- 2019牛客多校第一场H XOR 线性基模板
H XOR 题意 给出一组数,求所有满足异或和为0的子集的长度和 分析 n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这 ...
- [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...
随机推荐
- python语言特性-------python2.7教程学习【廖雪峰版】(一)
开始学习廖雪峰的py2.7教程: 2017年6月5日12:54:28 笔记: 廖雪峰python2.7教程1.用任何编程语言来开发程序,都是为了让计算机干活. 2.Python是一种相当高级的语言. ...
- 软件测试人员需要精通的开发语言(1)--- VBScript
软件测试不局限于点点点的纯黑盒测试,提升自身的代码能力也是事关重要的.软件测试的发展,越来越多的公司对于测试人员的要求也日益提高,测试人员必备开发能力的优势也凸显出来.简单的介绍下部分开发语言的学习及 ...
- 【BZOJ1125】[POI2008]Poc hash+map+SBT
[BZOJ1125][POI2008]Poc Description n列火车,每条有l节车厢.每节车厢有一种颜色(用小写字母表示).有m次车厢交换操作.求:对于每列火车,在交换车厢的某个时刻,与其颜 ...
- (比赛)B - 棋盘问题(dfs)
B - 棋盘问题 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & %llu Practice POJ ...
- 基于SQLAIchemy的Flask目录
预先知识 flask的基本使用 快速搭建开发的目录,以后我们在用Flask开发项目的时候可以直接用这个目录,不需要再自己创建. flask-sqlalchemy flask-sqlalchemy相当于 ...
- Redis通过PUBLISH / SUBSCRIBE 等命令实现了订阅与发布模式
# 切换目录 [root@localhost /]# cd /opt/redis-4.0.10 # 启动客户端 -p 指定端口 [root@localhost ~]# redis-cli -p 638 ...
- centos6安装nginx最详细步骤
第一步:在centos下面下载 nginx wget http://nginx.org/download/nginx-1.2.9.tar.gz 解压 tar zxf nginx-1. ...
- 教你使用SQL查询(1-12)
教你使用 Select 查询语句 (1) SELECT 语句基本语法简介 http://jimshu.blog.51cto.com/3171847/1363101(2) TOP 和 OFFSET 筛选 ...
- SAP HR 复制PA30的人员
[转自http://www.512test.com/home/space.php?uid=19&do=blog&id=2381] 很多顾问测试HR的程序时都为录入人员头痛,下面的程序提 ...
- 使用 Python 为 KVM 编写脚本,第 1 部分: libvirt
虚拟化是目前市场上大多数服务器操作系统的标准设备.在 Linux® 的世界里,服务器虚拟化有两个主要选择:基于 Kernel 的虚拟机 (KVM) 和 Xen.KVM 是 Red Hat 和其他公司采 ...