3140: [Hnoi2013]消毒

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1621  Solved: 676
[Submit][Status][Discuss]

Description

最近在生物实验室工作的小T遇到了大麻烦。
由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a、b、c 均为正整数。为了实验的方便,它被划分为a*b*c个单位立方体区域,每个单位立方体尺寸
为1*1*1。用(i,j,k)标识一个单位立方体,1 ≤i≤a,1≤j≤b,1≤k≤c。这个实验皿已经很久没有人用了,现在,小T被导师要求将其中
一些单位立方体区域进 行消毒操作(每个区域可以被重复消毒)。而由于严格的实验要求,他被要求使用一种特定 的F试剂来进行消毒。
这种F试剂特别奇怪,每次对尺寸为x*y*z的长方体区域(它由x*y*z个单位立方体组
成)进行消毒时,只需要使用min{x,y,z}单位的F试剂。F试剂的价格不菲,这可难倒了小
T。现在请你告诉他,最少要用多少单位的F试剂。(注:min{x,y,z}表示x、y、z中的最小 者。)

Input

第一行是一个正整数D,表示数据组数。接下来是D组数据,每组数据开头是三个数a,b,c表示实验皿的尺寸。接下来会出现a个b 行c列的用空格隔开的01矩阵,0表示对应的单位立方体不要求消毒,1表示对应的单位立方体需要消毒;例如,如果第1个01矩阵的第2行第3列为1,则表示单位立方体(1,2,3)需要被消毒。输入保证满足a*b*c≤5000,T≤3。

Output

仅包含D行,每行一个整数,表示对应实验皿最少要用多少单位的F试剂。

Sample Input

1
4 4 4
1 0 1 1
0 0 1 1
0 0 0 0
0 0 0 0
0 0 1 1
1 0 1 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
1 0 0 0

Sample Output

3

HINT

对于区域(1,1,3)-(2,2,4)和(1,1,1)-(4,4,1)消毒,分别花费2个单位和1个单位的F试剂。2017.5.26新加两组数据By Leoly,未重测.

Source

[Submit][Status][Discuss]

完全想错了方向,但是感觉难度不大。

首先显然我们可以让每次选的区域中有一维为1,这样就相当于每次选一个面,最后让这些面包含所有点。

考虑二维的情况,将x,y作为二分图的一条边,然后就是最小点覆盖问题。三维怎么做呢?注意到三个维度中最小的那个肯定不超过17,这样我们$2^{17}$枚举那个维度,剩下的直接按二维做即可。时间复杂度$O(2^{17}*5000)$,官方数据0.2s过,BZOJ新加的数据非常卡时过不了。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define rg register int
#define rep(i,l,r) for (rg i=(l); i<=(r); i++)
#define For(i,x) for (rg i=h[x],k; i; i=nxt[i])
using namespace std; const int N=,inf=;
int a,b,c,T,x,l,id,ans,cnt,tot,h[N],lk[N],vis[N],to[N],nxt[N];
struct P{int x,y,z; }p[N];
void add(rg u,rg v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } bool find(int x){
For(i,x) if (vis[k=to[i]]!=id){
vis[k]=id;
if (lk[k]==- || find(lk[k])) { lk[k]=x; return ; }
}
return ;
} int work(rg sta){
rg res=; rep(i,,a) h[i]=,lk[i]=-; cnt=;
rep(i,,tot) if (sta&(<<(p[i].z-))) add(p[i].x,p[i].y);
for (; sta; sta>>=) if (sta&) res++;
res=c-res;
rep(i,,a){ id++; if (find(i)) res++; }
return res;
} int main(){
freopen("clear.in","r",stdin);
freopen("clear.out","w",stdout);
for (scanf("%d",&T); T--; ){
scanf("%d%d%d",&a,&b,&c); ans=c; tot=;
rep(i,,a) rep(j,,b) rep(k,,c){
scanf("%d",&x); if (x) p[++tot]=(P){i,j,k};
}
if (a<b){ rep(i,,tot) swap(p[i].x,p[i].y); swap(a,b); }
if (a<c){ rep(i,,tot) swap(p[i].x,p[i].z); swap(a,c); }
if (b<c){ rep(i,,tot) swap(p[i].y,p[i].z); swap(b,c); }
for (rg sta=; sta<(<<c); sta++) ans=min(ans,work(sta));
printf("%d\n",ans);
}
return ;
}

最新文章

  1. mysql半同步复制问题排查
  2. C语言标准定义的32个关键字
  3. MySQL下全文索引
  4. supervisor的配置
  5. J2EE用户CPU占用过大后的分析过程
  6. java的定时器用法
  7. Android特效 五种Toast具体解释
  8. 【百度地图API1.1】修改文本标注的样式
  9. 【转】 Vim多行缩进及高级命令
  10. 一口一口吃掉Volley(四)
  11. 201621123062《java程序设计》第四周作业总结
  12. web进修之—Hibernate 关系映射(3)
  13. 3.27模拟赛 sutoringu(后缀数组)
  14. bash计算上下行数据差值
  15. vs问题集
  16. BR(BoomerangRobot)机器人项目
  17. P1272 重建道路
  18. 【抓包分析】Charles和 夜神模拟器 对安卓应用进行抓包分析
  19. ionic组件清单
  20. Tomcat的JVM设置和连接数设置

热门文章

  1. 【BZOJ】2553: [BeiJing2011]禁忌 AC自动机+期望+矩阵快速幂
  2. Impala笔记之通用命令
  3. nginx 配置代理某个路径
  4. docker之构建redis-cluster集群
  5. Ubuntu之设置应用开机自启动
  6. python3-可变和不可变数据类型
  7. 70.如何在xilinx SDK中显示行号
  8. SSL handshake failed: SSL error: Key usage violation in certificate has been detected.
  9. NLP基础 成分句法分析和依存句法分析
  10. 使用 redis 减少 秒杀库存 超卖思路