【LOJ】#2384. 「HNOI2013」切糕
题解
神仙网络流啊……
naive的我一直想把每个纵轴拆点,每个纵轴建R个点(大概是要跑费用流吧……)……然后第二个限制就gg了,什么也想不出来,菜啊TAT
后来我发现大神们的建图都是,一个原点,一个汇点,一段长条,每一段就是一个点,流量是值,那么最小割就是最小值了,很神奇
然后每相邻的两个纵轴z向z - D连一条边,z再向z + D连一条边
感觉很神奇,后来我想了一下,这样并不能保证割了z之后一定割了相邻的[z - D,z+D]的点,而是可以保证,如果割错了这个割一定会被换掉!错误的答案是有限的,重复的错误不会出现……所以,最后就是正确的答案了呗。。。
最小割保证了答案最小
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define enter putchar('\n')
#define space putchar(' ')
#define MAXN 70005
//#define ivorysi
using namespace std;
typedef long long int64;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res = res * f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
struct node {
int to,next,cap;
}E[4000005];
int head[MAXN],sumE = 1,S,T,last[MAXN],Ncnt;
int dis[MAXN],gap[MAXN],P,Q,R,D;
int val[45][45][45],MK[45][45][45];
int dx[] = {0,-1};
int dy[] = {-1,0};
void add(int u,int v,int c) {
E[++sumE].to = v;
E[sumE].next = head[u];
E[sumE].cap = c;
head[u] = sumE;
}
void addtwo(int u,int v,int c) {
add(u,v,c);add(v,u,0);
}
int sap(int u,int aug) {
if(u == T) return aug;
int flow = 0;
for(int i = last[u] ; i ; last[u] = i = E[i].next) {
int v = E[i].to;
if(E[i].cap) {
if(dis[v] + 1 == dis[u]) {
int t = sap(v,min(aug - flow,E[i].cap));
flow += t;
E[i].cap -= t;
E[i ^ 1].cap += t;
if(flow == aug) return flow;
if(dis[S] >= T) return flow;
}
}
}
--gap[dis[u]];if(!gap[dis[u]]) dis[S] = T;
++gap[++dis[u]];last[u] = head[u];
return flow;
}
void Solve() {
read(P);read(Q);read(R);
read(D);
for(int i = 1 ; i <= R ; ++i) {
for(int j = 1 ; j <= P ; ++j) {
for(int k = 1 ; k <= Q ; ++k) {
read(val[j][k][i]);
}
}
}
S = ++Ncnt;
T = P * Q * (R + 1) + 10;
for(int i = 1 ; i <= P ; ++i) {
for(int j = 1 ; j <= Q ; ++j) {
++Ncnt;addtwo(S,Ncnt,0x7fffffff);
for(int k = 1 ; k <= R; ++k) {
++Ncnt;
MK[i][j][k] = Ncnt;
addtwo(Ncnt - 1,Ncnt,val[i][j][k]);
}
addtwo(Ncnt,T,0x7fffffff);
}
}
for(int i = 1 ; i <= P ; ++i) {
for(int j = 1 ; j <= Q ; ++j) {
for(int h = 0 ; h <= 1 ; ++h) {
int tx = i + dx[h],ty = j + dy[h];
if(tx <= 0 || ty <= 0) continue;
for(int k = 1 ; k <= R ; ++k) {
if(k - D >= 1) addtwo(MK[i][j][k],MK[tx][ty][k - D],0x7fffffff);
if(k + D <= R) addtwo(MK[tx][ty][k + D],MK[i][j][k],0x7fffffff);
}
}
}
}
for(int i = 1 ; i <= T ; ++i) last[i] = head[i];
int ans = 0;
while(dis[S] < T) ans += sap(S,0x7fffffff);
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
【LOJ】#2384. 「HNOI2013」切糕的更多相关文章
- 「题解」「HNOI2013」切糕
文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...
- 「HNOI2013」切糕
题目链接 戳我 \(Solution\) 对于这道题,我们首先来看看没有\(D\)这个约束的该如何做. 我们考虑构造最小割模型. 其实直接贪心就好了,选出每条路径上的最小值就好了(路径就是将每层的同一 ...
- BZOJ3144/LG3227 「HNOI2013」切糕 最小割离散变量模型
问题描述 BZOJ3144 LG3227 还想粘下样例 输入: 2 2 2 1 6 1 6 1 2 6 2 6 输出: 6 题解 关于离散变量模型,我不想再抄一遍,所以: 对于样例,可以建立出这样的图 ...
- 「HNOI2013」游走
「HNOI2013」游走 题目描述 一个无向连通图,顶点从 \(1\) 编号到 \(N\) ,边从 \(1\) 编号到 \(M\) .小 \(Z\) 在该图上进行随机游走,初始时小 \(Z\) 在 \ ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
随机推荐
- python中的文件操作(2)
a+,w+,r+的特点: r+:r+模式允许读和写,当对文件句柄只进行写操作时,tell(),seek()为写操作的‘指针’(也就是写到seek()处). 当只进行读操作时,tell(),seek() ...
- 手把手教你使用koa2
简介 koa是由express的原班人马打造的web框架.但是相对于express,koa的性能要更高,因为koa通过使用aysnc函数,帮你丢弃回调函数,并有力的增强了错误处理.而且koa没有绑定任 ...
- MySQL触发器的正确使用与案例分析
以下的文章主要向大家讲述的是MySQL触发器的实际使用详细说明与实际案例分析,同时本文也列举了一些在MySQL触发器的实际式操作中的代码,以下就是文章的详细内容介绍,望大家借鉴. 触发器案例 mysq ...
- Spring boot学习总结
引言之前也没有深入学习过spring框架,最近SpringBoot流行起来后想补下这方面的知识,于是照着SpringBoot官网上的英文教程开始helloworld入门,踩到几个小坑,记录下学习流程. ...
- 使用object_box遇到的崩溃 java.lang.UnsatisfiedLinkError:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/ ...
- HDU 1718 Rank 排序
解题报告:给一个班的学生的分数排序,然后判断Jack在他们班级的排名是多少,并且有如下规定,若多个人的分数相同,则他们的排名也 是相同的.说白了就是问这个班上分数比Jack高的人数有多少个,如果有n个 ...
- webpack构建react多页面应用
写这个的初衷是很难找一个简洁的项目脚手架,很多脚手架都有很多依赖,光看依赖就要很久,所以自己参照网上的内容,弄个这么一个简单的多页面的脚手架. 利用creat-react-app 新建一个react应 ...
- HTTP请求方法 之 HEAD
HTTP请求方法并不是只有GET和POST,只是最常用的.据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS.GET.HEAD.POST.PUT.DELETE.TR ...
- 【codeforces】【比赛题解】#948 CF Round #470 (Div.2)
[A]Protect Sheep 题意: 一个\(R*C\)的牧场中有一些羊和一些狼,如果狼在羊旁边就会把羊吃掉. 可以在空地上放狗,狼不能通过有狗的地方,狼的行走是四联通的. 问是否能够保护所有的羊 ...
- C++ 和 MFC的学习
1. 在Windows应用程序设计中,既可以使用个C的基本数据类型,也可以使用Windows自定义的数据类型.但要注意,凡是Windows自定义的关键字都要大写. 2. 什么是句柄? 在Windows ...