FJ省队集训最终测试 T3






思路:状态压缩dp,f[i][j[[k]代表i行j列这个格子,连续的状态为k,这个连续的状态是什么?就是下图

X格子代表我当前走到的地方,而这里的状态就是红色部分,也就是连续的一段n的状态,我们是分每一位计算的,这样就可以转移了,注意,当当前点在最下面的时候要额外计算一个与1的贡献。
坑爹,inf设小了只有30分。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
const ll inf=1e18;
ll f[][],bin[],sum[],ans;
ll a[][],b[][],c1[][],c2[][];
ll s[];
int n,m;
ll read(){
ll t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
ll query(int id,int j,int st){
int top=;
for (int i=;i<=n;i++){
s[++top]=st%;
st/=;
}
s[]=s[top];s[top+]=s[];
ll res=;
for (int i=;i<=n;i++)
res+=((s[i]*bin[id])^(a[i][j]&bin[id]))*b[i][j];
for (int i=;i<=n;i++)
res+=((s[i]*bin[id])^(bin[id]*s[i+]))*c2[i][j];
return res;
}
void dp(int id){
int tot=(<<n)-,cnt=;
for (int i=;i<=n*m;i++)
for (int j=;j<=tot;j++)
f[i][j]=inf;
for (int i=;i<=tot;i++)
f[n][i]=query(id,,i);
for (int j=;j<=m;j++)
for (int i=;i<=n;i++){
int now=(j-)*n+i,pre=now-;
for (int st=;st<=tot;st++){
int st1=st&sum[n-],lst=((st&bin[n-])>),ths=((st&bin[n-])>);
ll tmp=;
if (i!=) tmp+=((lst^ths)*c2[i-][j])*bin[id];
if (i==n) tmp+=(((st&bin[])^ths)*c2[i][j])*bin[id];
tmp+=((a[i][j]&bin[id])^(ths*bin[id]))*b[i][j];
for (int k=;k<=;k++){
int st2=st1*+k,beh=((st2&bin[])>);
ll tmp2=(beh^ths)*bin[id]*c1[i][j-];
f[now][st]=std::min(f[now][st],f[pre][st2]+tmp+tmp2);
}
}
}
ll Tmp=inf;
for (int i=;i<=tot;i++)
Tmp=std::min(f[n*m][i],Tmp);
ans+=Tmp;
}
int main(){
n=read();m=read();bin[]=;
for (int i=;i<=;i++) bin[i]=bin[i-]*;sum[]=bin[];
for (int i=;i<=;i++) sum[i]=sum[i-]+bin[i];
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
a[i][j]=read();
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
b[i][j]=read();
for (int i=;i<=n;i++)
for (int j=;j<m;j++)
c1[i][j]=read();
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
c2[i][j]=read();
for (int i=;i<=;i++){
dp(i);
}
printf("%I64d\n",ans);
fclose(stdin);fclose(stdout);
return ;
}
FJ省队集训最终测试 T3的更多相关文章
- FJ省队集训最终测试 T2
思路:发现如果一个人一共选了x个点,那么选中某一个点对的概率都是一样的,一个人选x个点的总方案是C(n,x),一个人选中某个点对的总方案是C(n-2,x-2),这样,那么选中某个点对的概率就是 x*( ...
- FJ省队集训DAY4 T3
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #inclu ...
- FJ省队集训DAY5 T1
思路:考试的时候打了LCT,自以为能过,没想到只能过80.. 考完一想:lct的做法点数是100W,就算是nlogn也会T. 讲一下lct的做法把:首先如果一条边连接的两个点都在同一个联通块内,那么这 ...
- FJ省队集训DAY4 T2
XXX #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #i ...
- FJ省队集训DAY4 T1
直接上题解 #include<cstdio> #include<iostream> #include<cmath> #include<cstring> ...
- FJ省队集训DAY3 T2
思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用 ...
- FJ省队集训DAY3 T1
思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分. 因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的 ...
- FJ省队集训DAY2 T2
思路:我们可以考虑三角剖分,这样问题就变成考虑三角形的选取概率和三角形内有多少个点了. 先用树状数组预处理出三角剖分的三角形中有多少个点,然后用线段树维护,先用原点极角排序,然后枚举i,再以i极角排序 ...
- FJ省队集训DAY2 T1
思路:转换成n条三维空间的直线,求最大的集合使得两两有交点. 有两种情况:第一种是以某2条直线为平面,这时候只要统计这个平面上有几条斜率不同的直线就可以了 还有一种是全部交于同一点,这个也只要判断就可 ...
随机推荐
- 【HDOJ】3316 Mine sweeping
简单BFS. #include <iostream> #include <cstdio> #include <cstring> #include <cstdl ...
- BZOJ3479: [Usaco2014 Mar]Watering the Fields
3479: [Usaco2014 Mar]Watering the Fields Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 81 Solved: ...
- CH Round #55 - Streaming #6 (NOIP模拟赛day2)
A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...
- BZOJ1634: [Usaco2007 Jan]Protecting the Flowers 护花
1634: [Usaco2007 Jan]Protecting the Flowers 护花 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 448 So ...
- 用 O(1) 时间检测整数 n 是否是 2 的幂次。
位操作 2的幂次数 2 10 4 100 8 1000 16 10000 ... 1 class Solution { 2 /* 3 * @param n: An integer 4 * @retu ...
- C++ 哈希表
从2011年开始,C++支持非排序的unordered_map和unordered_set(原先的map和set都是通过有序结构实现的) 下面是一些性能上的测试 #include<iostrea ...
- MemSQL 3.1 发布,元方,你怎么看? - V2EX
MemSQL 3.1 发布,元方,你怎么看? - V2EX MemSQL 3.1 发布,元方,你怎么看?
- git命令使用方法
git安装包 http://c35.yunpan.360.cn/my/?sid=#%2F%E5%AE%89%E8%A3%85%E5%8C%85%2FGit%E5%AE%89%E8%A3%85%2F g ...
- SQL Server 启用 xp_cmdshell 与bcp 使用
启用 xp_cmdshell 1: sp_configure 'show advanced options',1 2: reconfigure 3: GO 4: 5: sp_configure 'xp ...
- JavaScript基础知识(学习笔记)
1. 在JavaScript中所有事物都是对象:字符串.数字.数组.日期等等2. 在JavaScript中,对象是拥有属性和方法的数据3. 属性是与对象相关的值,方法是能够在对象上执 ...