题意:你有一个棋盘,某些格子是限制条件,形如"从这里开始下面所有连续空格的和为a"或"从这里开始向右的所有连续空格之和为b"一个格子可以同时拥有两个限制条件。

每个数都必须是正整数。

现在你可以把某些格子加/减1,并花费相应的代价。可以操作无数次。求把棋盘变得合法的最小代价。

解:没想出来,看了题解......

一开始想了数字和条件构成二分图,又想了行列连边,但是始终建不出图来。

行列连边。

因为既可以加又可以减不好搞,我们可以先全部转换成满足条件的最小值,然后往上加。

从最小值到初始值的时候,边权为负。之后边权为正。

不可修改的地方边权为INF。

然后跑一个最小费用可行流就是答案。

如何判断无解?

考虑每条边,如果有的边费用为INF但是有流量,就不合法。

 #include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring> typedef long long LL;
const LL N = , M = , INF = 0x3f3f3f3f, J = ; struct Edge {
LL nex, v, c, len;
}edge[N << ]; LL top = ; LL e[N], d[N], vis[N], pre[N], flow[N];
std::queue<LL> Q;
LL fr[J][J], val[J][J], v2[J][J], cst[J][J], c2[J][J], m; inline void add(LL x, LL y, LL z, LL w) {
top++;
edge[top].v = y;
edge[top].c = z;
edge[top].len = w;
edge[top].nex = e[x];
e[x] = top; top++;
edge[top].v = x;
edge[top].c = ;
edge[top].len = -w;
edge[top].nex = e[y];
e[y] = top;
return;
} inline bool SPFA(LL s, LL t) {
memset(d, 0x3f, sizeof(d));
d[s] = ;
flow[s] = INF;
vis[s] = ;
Q.push(s);
while(!Q.empty()) {
LL x = Q.front();
Q.pop();
vis[x] = ;
for(LL i = e[x]; i; i = edge[i].nex) {
LL y = edge[i].v;
if(edge[i].c && d[y] > d[x] + edge[i].len) {
d[y] = d[x] + edge[i].len;
pre[y] = i;
flow[y] = std::min(flow[x], edge[i].c);
if(!vis[y]) {
vis[y] = ;
Q.push(y);
}
}
}
}
return d[t] < INF;
} inline void update(LL s, LL t) {
LL temp = flow[t];
while(t != s) {
LL i = pre[t];
edge[i].c -= temp;
edge[i ^ ].c += temp;
t = edge[i ^ ].v;
}
return;
} inline LL solve(LL s, LL t, LL &cost) {
LL ans = ;
cost = ;
while(SPFA(s, t)) {
if(d[t] > ) {
break;
}
ans += flow[t];
cost += flow[t] * d[t];
update(s, t);
}
return ans;
} inline LL id(LL x, LL y) {
return (x - ) * m + y;
} int main() {
LL n, use = ;
scanf("%lld%lld", &n, &m);
for(LL i = ; i <= n; i++) {
for(LL j = ; j <= m; j++) {
scanf("%lld", &fr[i][j]);
}
}
for(LL i = ; i <= n; i++) {
for(LL j = ; j <= m; j++) {
if(fr[i][j] == ) {
continue;
}
else if(fr[i][j] == ) {
scanf("%lld", &val[i][j]);
}
else if(fr[i][j] == ) {
scanf("%lld", &v2[i][j]);
}
else if(fr[i][j] == ) {
scanf("%lld%lld", &val[i][j], &v2[i][j]);
}
else {
scanf("%lld", &val[i][j]);
}
}
}
for(LL i = ; i <= n; i++) {
for(LL j = ; j <= n; j++) {
if(fr[i][j] == ) {
continue;
}
else if(fr[i][j] == ) {
scanf("%lld", &cst[i][j]);
}
else if(fr[i][j] == ) {
scanf("%lld", &c2[i][j]);
}
else if(fr[i][j] == ) {
scanf("%lld%lld", &cst[i][j], &c2[i][j]);
}
else {
scanf("%lld", &cst[i][j]);
}
if(cst[i][j] == -) {
cst[i][j] = INF;
}
if(c2[i][j] == -) {
c2[i][j] = INF;
}
}
}
// read over
LL lm = n * m;
LL s = lm * + ;
LL t = s + ;
for(LL i = ; i <= n; i++) {
for(LL j = ; j <= m; j++) {
if(fr[i][j] == ) {
continue;
}
if(fr[i][j] == || fr[i][j] == ) {
// id(i, j)
LL cnt = ;
for(LL k = i + ; k <= n; k++) {
if(fr[k][j] == ) {
cnt++;
}
else {
break;
}
}
// val[i][j] - cnt
if(val[i][j] > cnt) {
add(s, id(i, j), val[i][j] - cnt, -cst[i][j]);
}
add(s, id(i, j), INF, cst[i][j]);
use += cst[i][j] * abs(val[i][j] - cnt);
}
if(fr[i][j] == || fr[i][j] == ) {
LL cnt = ;
for(LL k = j + ; k <= m; k++) {
if(fr[i][k] == ) {
cnt++;
}
else {
break;
}
}
if(v2[i][j] > cnt) {
add(id(i, j) + lm, t, v2[i][j] - cnt, -c2[i][j]);
}
add(id(i, j) + lm, t, INF, c2[i][j]);
use += c2[i][j] * abs(v2[i][j] - cnt);
}
if(fr[i][j] == ) {
LL a, b;
for(LL k = i - ; k >= ; k--) {
if(fr[k][j] == || fr[k][j] == ) {
a = id(k, j);
break;
}
}
for(LL k = j - ; k >= ; k--) {
if(fr[i][k] == || fr[i][k] == ) {
b = id(i, k) + lm;
break;
}
}
if(val[i][j] > ) {
add(a, b, val[i][j] - , -cst[i][j]);
}
add(a, b, INF, cst[i][j]);
use += cst[i][j] * abs(val[i][j] - );
}
}
} LL ans;
solve(s, t, ans);
ans += use; /*if(ans >= INF) {
puts("-1");
return 0;
}*/
for(int i = ; i <= top; i += ) {
if(abs(edge[i].len) == INF && (edge[i].c && edge[i ^ ].c)) {
puts("-1");
return ;
}
} printf("%lld", ans);
return ;
}

AC代码

思考:能否不转换为最小?好像无法判断是否合法...

洛谷P4486 Kakuro的更多相关文章

  1. Solution -「BJWC 2018」「洛谷 P4486」Kakuro

    \(\mathcal{Description}\)   Link.   有一个 \(n\times m\) 的网格图,其中某些格子被主对角线划成两个三角形,称这样的格子为特殊格:初始时,除了一些障碍格 ...

  2. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  3. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  4. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  5. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  6. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  7. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  8. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

  9. 洛谷八月月赛Round1凄惨记

    个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...

随机推荐

  1. 20155217《网络对抗》Exp07 网络欺诈防范

    20155217<网络对抗>Exp07 网络欺诈防范 实践内容 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术,用DNS spoof引导特定访问到冒 ...

  2. 【php增删改查实例】第一节 - PHP开发环境配置

    最近需要使用PHP,于是把平时的积累整理一下,就有了这个教程. 首先是环境配置: 1.操作系统:windos7 2.后台:PHP 3.前台:Html + js + css 4.数据库:MYSQL 5. ...

  3. Kubernetes学习之路(二十三)之资源指标和集群监控

    目录 1.资源指标和资源监控 2.Weave Scope监控集群 (1)Weave Scope部署 (2)使用 Scope (3)拓扑结构 (4)实时资源监控 (5)在线操作 (6)强大的搜索功能 2 ...

  4. mongodb安装教程

    MongoDB 下载及安装 MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www. ...

  5. SQL Server 常用内置函数

    本文用于收集在运维中经常使用的系统内置(built-in)函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID ...

  6. jqGrid 奇淫巧技

    1.新建maven-web项目 结构如图 #GLOBAL_DIGITALMEDIA_SEARCH_grid-table > tbody > tr >td:last-child{ te ...

  7. VirtualBox虚拟机怎么导入已经存在的vdi文件

    VirtualBox虚拟机怎么导入已经存在的vdi文件 第一章 1.原因 早上一不小心将virtualBox 卸载了,(不知道怎么了, 里面得虚拟机全部都没有了,但是vdi文件还在) 2.解决办法 直 ...

  8. FME Cloud 账号申请流程

    第一步,访问SAFE的FME Cloud注册页,官网明确表态,如果你是一个新的FME Cloud用户,你可以免费获得一个初级版.地址:https://console.fmecloud.safe.com ...

  9. 英特尔帮助优化 Epic 的《堡垒之夜》* 和 Unreal Engine*

    您可能知道,Epic 的游戏<堡垒之夜>是 Unreal Engine* 技术的绝佳示例,<堡垒之夜>的开发团队正不断改进游戏,增加支持平台的数量并将信息反馈给引擎.为此,英特 ...

  10. arduino新入手体验:三个小实验

    新入手体验:三个小实验 一:一个LED闪烁 控制要求:1个LED灯,每隔50ms闪烁一次 实物连接图: 控制代码: //2018.6/11 ;//定义数字接口10,对应 void setup() { ...