传送门

题目大意懒得写了,题目说的挺明白的了

题解

主要的难点在于异或意义下的最大值和很玄学,但不难发现这道题中让你定义的$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棋盘的更多相关文章

  1. 【BZOJ4676】Xor-Mul棋盘 拆位+状压DP

    [BZOJ4676]Xor-Mul棋盘 Description 一个n*m的棋盘,左上角为(1,1),右下角为(n,m).相邻的2点之间有连边(如下图中实线)特殊地,(1,i)与(n,i)也连有一条边 ...

  2. MySQL Out-of-Band 攻击

    概述 当涉及到MSSQL与Oracle时,Out-of-Band 注入是非常好的方式.但我注意到MySQL注入的情况并非如此,于是我准备以自己在SQL注入方面的经验做相关的研究.我们可以利用诸如loa ...

  3. [TJOI2015] 棋盘

    Description 为了提高智商,ZJY去新世界旅游了.可是旅游过后的ZJY杯具的发现要打开通往原来世界的门,必须要解开门上面画的谜题.谜题是这样的:有个\(n\)行\(m\)列的棋盘,棋盘上可以 ...

  4. 【洛谷】【搜索(dfs)】P3956 棋盘

    题目传送门:戳 题目描述: 有一个 \(m * m\) 的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色 ...

  5. [luogu P1169] [ZJOI2007]棋盘制作

    [luogu P1169] [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的 ...

  6. 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的约数,则可以使用素数筛 ...

  7. 【CZY选讲·Hja的棋盘】

    题目描述 Hja特别有钱,他买了一个×的棋盘,然后Yjq到这个棋盘来搞事.一开始所有格子都是白的,Yjq进行次行操作次列操作,所谓一次操作,是将对应的行列上的所有格子颜色取反.现在Yjq希望搞事之后 ...

  8. 2019牛客多校第一场H XOR 线性基模板

    H XOR 题意 给出一组数,求所有满足异或和为0的子集的长度和 分析 n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这 ...

  9. [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 ...

随机推荐

  1. PHP-Manual的学习----【语言参考】----【类型】-----【NULL】

    2017年8月24日11:34:061.特殊的 NULL 值表示一个变量没有值.NULL 类型唯一可能的值就是 NULL. 2.在下列情况下一个变量被认为是 NULL: ◦ 被赋值为 NULL. ◦ ...

  2. windows安装apache

    由于个人有强迫倾向,下载软件都喜欢从官网下载,摸索了好久终于摸清楚怎么从Apache官网下载windows安装版的Apache服务器了,现在分享给大家.   工具/原料   apache 方法/步骤 ...

  3. Spring MVC 返回Json IE出现下载

    今天在做一个利用IFrame提交进行form提交表单的时候发现返回的json在ie下竟然弹出了下载的提示, 于是就查看了返回的Content-type:appliation/json;charset= ...

  4. Ubuntu 12.04使用uginx+fastcgi-mono-server2部署asp.net 网站

    Ubuntu 12.04使用uginx+fastcgi-mono-server2部署asp.net 网站 1.安装nginx和mono-fastcgi-server2 sodu apt-get  in ...

  5. 在安装mysql数据库的过程中,显示msvcp100.dll丢失?则么办?

    方案一:重装操作系统为windows10专业版 方案二:问题: 解答: 报错原因是VC运行库不全或者没有安装导致,百度搜索VC集合下载安装, 链接:https://pan.baidu.com/s/1U ...

  6. VS2017下编译iconv

    从http://www.gnu.org/software/libiconv/ 下载 libiconv-1.11.1, 这是最后一个支持MSVC编译的版本. 打开 Visual Studio 2017 ...

  7. Token Fund到底是什么?

    相比传统的VC基金,作为新生事物的Token Fund从一出场便吸引着行业目光的追随.行业早期ICO促使区块链行业野蛮生长,大量区块链项目涌现,同时也带动了大量“代投”朝Token Fund方向发展. ...

  8. CENTOS7 修改网卡名称为eth[012...],格式

    具体操作是修改/etc/default/grub文件 在GRUB_CMDLINE_LINUX一行中添加net.ifnames=0 biosdevname=0 保存文件后然后运行 grub2-mkcon ...

  9. Basis 基础

    [转自 http://www.cnblogs.com/elegantok/archive/2008/11/03/1325163.html] 1 Basis1. Unix操作 更改口令 passwd e ...

  10. Android动画效果animation

    1.Tween 根据指定动画开始和结束时的对象属性(位置.Alpha值(透明度).大小.角度等)以及动画播放的时间长度生成动画: 2.Frame 指定每一帧所播放的图片和时间长度.   建立动画的方法 ...