题目链接

戳我

\(Solution\)

我们首先想一想如果这一题只是二维的该怎么办?

就是一个最小点覆盖问题.这里就不详细解释了,用网络流或匈牙利都无所谓.

但现在是三维的,那么现在该如何处理呢?

我们发现\(a*b*c<=5000\),所以必定有一个要小于\(\sqrt[3]{5000}\)

所以我们可以枚举最小的一维的状态,那一维已经消了,还是没消.

对于没消的直接如同二维的跑最小点覆盖就好了.

但是\(bzoj\)实在卡不过去

\(Code\)

#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9')
x=x*10+c-'0',c=getchar();
return x*f;
}
#define re register
struct node{
int to,next,v;
}a[200001];
int S[100001],ss[100001],vis[100001],bj[50],bin[50],head[100001],dep[10001],cnt,n,m,s,t,x,y,z,A,B,C,res,Min,minx,tot,hh,maxx,cur[100010];
inline void add(re int x,re int y,re int c){
a[++cnt].to=y,a[cnt].next=head[x],a[cnt].v=c,head[x]=cnt;
a[++cnt].to=x,a[cnt].next=head[y],a[cnt].v=0,head[y]=cnt;
}
queue<int> q;
inline int bfs(){
for(int i=s;i<=t;i++)
dep[i]=0;
q.push(s);
dep[s]=1;
while(!q.empty()){
re int now=q.front();
q.pop();
for(re int i=head[now];i;i=a[i].next){
re int v=a[i].to;
if(!dep[v]&&a[i].v>0)
dep[v]=dep[now]+1,q.push(v);
}
}
if(dep[t])
return 1;
return 0;
}
int dfs(int k,int list) {
if(k==t||!list)
return list;
int flow=0;
for(int &i=cur[k]; i; i=a[i].next) {
int v=a[i].to;
if(dep[v]==dep[k]+1&&a[i].v) {
int p=dfs(v,min(list,a[i].v));
if(p){
list-=p;
flow+=p;
a[i].v-=p;
if(i%2)
a[i+1].v+=p;
else
a[i-1].v+=p;
if(!list)
break;
}
}
}
if(!flow)
dep[k]=-1;
return flow;
}
inline int Dinic(int js){
re int k;
while(bfs()){
for(re int i=0;i<=t;i++)
cur[i]=head[i];
while((k=dfs(s,inf))){
js+=k;
if(js>=Min)
return js;
}
}
return js;
}
struct node1 {
int x,y,z;
}b[5010];
inline void solve(re int x){
cnt=s=tot=maxx=0;
re int ans=0;
for(re int i=0;i<A;i++){
if(x&(1<<i)) ans++,bj[i+1]=0;
else bj[i+1]=1;
}
for(re int i=1;i<=res;i++)
if(bj[b[i].x]) S[++tot]=b[i].y,ss[tot]=b[i].z;
for(re int i=1;i<=tot;i++) maxx=max(maxx,max(S[i],ss[i]));
t=maxx*2+1;
for(re int i=s;i<=t;i++)
head[i]=0;
for(re int i=1;i<=maxx;i++)
add(s,i,1),add(i+maxx,t,1);
for(re int i=1;i<=tot;i++) add(S[i],ss[i]+maxx,1);
Min=min(Min,Dinic(ans));
}
int main(){
int D=read();
bin[0]=1;
for(re int i=1;i<=20;i++)
bin[i]=bin[i-1]<<1;
while(D--){
A=read(),B=read(),C=read(),minx=min(A,min(B,C)),res=0,Min=inf;
if(B==minx)
swap(A,B);
else if(C==minx)
swap(A,C);
for(re int i=1;i<=A;i++)
for(re int j=1;j<=B;j++)
for(re int k=1;k<=C;k++){
x=read();
if(x)
b[++res].x=i,b[res].y=j,b[res].z=k;
}
for(re int i=0;i<bin[A];i++)
solve(i);
printf("%d\n",Min);
}
}

「HNOI 2013」消毒的更多相关文章

  1. 「HNOI 2013」游走

    题目链接 戳我 \(Solution\) 首先申明几个变量: f[x]:到点x的概率, vis[x]:x点的度 dp[x][y]:(x,y)这条边的概率 number[x][y]:x这条边的编号 下面 ...

  2. 「HNOI 2013」比赛

    题目链接 戳我 \(Solution\) 这道题观察数据范围发现很小,再看看题目可以发现是搜索. 这题纯搜索会\(T\)所以要加入适当剪枝 如果一个人后面的比赛都赢却依旧到不了目标分数,则直接\(re ...

  3. 「HNOI 2013」数列

    题目链接 戳我 \(Solution\) 这道题貌似并不难的样子\(QAQ\) 我们发现这个因为有首项的关系所以有点不太好弄.所以我们要将这个首项对答案的影响给去掉. 我们可以构建一个差分数组,我们令 ...

  4. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  5. 「HNOI 2019」白兔之舞

    一道清真的数论题 LOJ #3058 Luogu P5293 题解 考虑$ n=1$的时候怎么做 设$ s$为转移的方案数 设答案多项式为$\sum\limits_{i=0}^L (sx)^i\bin ...

  6. 「HNOI 2016」 序列

    \(Description\) 给你一个序列,每次询问一个区间,求其所有子区间的最小值之和 \(Solution\) 这里要用莫队算法 首先令\(val\)数组为原序列 我们考虑怎么由一个区间\([l ...

  7. 「HNOI 2015」实验比较

    \(Description\) 有\(n\)个元素,对于每个元素\(x_i\)最多知道一个形如\(x_j < x_i\)或\(x_j=x_i\)的条件,问有多少合法的序列.合法的序列满足每个元素 ...

  8. 「HNOI 2014」 江南乐

    \(Description\) \(n\)堆石子,每堆石子有\(s_i\)个,两个人轮流操作,每次可以将一对不少于\(F\)的石子尽量平均分成\(m\)堆,\(m\)每次自选,不能操作者输.共有\(T ...

  9. 「HNOI 2015」亚瑟王

    \(Description\) 有\(n\)张卡牌,每一张卡牌有\(p_i\)的概率发动,并造成\(d_i\)点伤害.一共有\(r\)轮,每一轮按照编号从小到大依次考虑,如果这张牌已经发动过则跳过该牌 ...

随机推荐

  1. 从邮件原理来看 postfix和docecot

    好早好早以前计算机网络老师就教了说,邮件嘛,就三个协议smtp,imap,pop3. smtp 用来发邮件,imap,pop3用来收邮件.噢?是么.难道没有发现这句话有非常多的漏洞,根本就不能说清楚这 ...

  2. 解剖Nginx·模块开发篇(5)解读内置非默认模块 ngx_http_stub_status_module

    1 Background ngx_http_stub_status_module 是一个 Nginx 的内置 HTTP 模块,该模块可以提供 Nginx 的状态信息.默认情况下这个模块是不被编译进来的 ...

  3. 利用Fiddler对Android模拟器网络请求进行抓包

    安装使用Fiddler 下载安装Fiddler的方法这里就略过了,一路Next就行了.装好之后运行软件,正常情况这个时候我们已经可以对电脑的网络请求进行抓包了.Fiddler默认的代理地址是127.0 ...

  4. 226. Invert Binary Tree 翻转二叉树

    [抄题]: Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 [暴力解法]: 时间分析: 空间分 ...

  5. svn服务,svnserve开机启动

    在服务器(我的环境是centos6.5)上部署完svn之后,一般都希望每次重启的时候svn服务能够随着启动.上网搜索了一下,一般有两种做法: 一.启动脚本+/etc/rc.local启动 1. 在某个 ...

  6. VMWare windows找不到microsoft软件许可条款

    提示如下错误: windows找不到microsoft软件许可条款.请确保安装源有效,然后重新启动安装. 解决方案: 把该虚拟机中的系统硬件配置中的软盘去掉. 程序员的基础教程:菜鸟程序员

  7. Linux 系统配置

    centos 7 防火墙和端口配置开启redis端口,修改防火墙配置文件 vi /etc/sysconfig/iptables 加入端口配置 -A RH-Firewall-1-INPUT -m sta ...

  8. nltk 之 snowball 提取词干-乾颐堂

    机器学习中很重要的应用场景就是机器自动分类,而分类的关键是词干提取.所以我们要用到snowball.下面说一下snowball 提取词干的两种方法. 两种方法: 方法一: >>> f ...

  9. python准确判断文件类型

    判断文件类型在开发中非常常见的需求,怎样才能准确的判断文件类型呢?首先大家想到的是文件的后缀,但是非常遗憾的是这种方法是非常不靠谱的,因为文件的后缀是可以随意更改的,而大家都知道后缀在linux系统下 ...

  10. 1、设备网络SDK主要功能

    图像预览.文件回放和下载,云台控制,布防/撤防,语音对讲,日志管理,解码卡,远程升级,远程重启/关闭,格式化硬盘,参数配置(系统配置,通道配置,串口配置,报警配置,用户配置),多路解码器,智能设备功能 ...