【CLYZ集训】催眠大师【费用流】

2023-10-27

题目大意

给定一个 n × m n\times m n×m 的棋盘,棋盘上每个位置要么为空要么为障碍。定义棋盘上两个位置 ( x , y ) , ( u , v ) (x,y),(u,v) (x,y),(u,v)能互相攻击当前仅当满足以下两个条件:
1. x = u x=u x=u y = v y=v y=v
2.对于 ( x , y ) (x,y) (x,y) ( u , v ) (u,v) (u,v)之间的所有位置,均不是障碍。
现在有 q q q个询问,每个询问给定 m m m,要求从棋盘中选出 m m m个空位置来放棋子,问最少互相能攻击到的棋子对数是多少?

思路:

考虑费用流。对于每一行和每一列,连续没有障碍的格子组成一个连续段。如果当前位置为 ( i , j ) (i,j) (i,j)且不是障碍,则该横连续段向该列连续段连一条容量为1的边,费用为0。代表这里放不会有贡献。
然后源点向所有横连续段建边,边的容量为连续段的大小x,费用为 ( x 2 ) \binom{x}{2} (2x)
然后汇点同理。
但显然这样是不行的,因为一个连续段放的棋子个数是不确定的。所以分开建边,建x条边,第i条容量为1,费用为i-1,这样就可以满足 ( x 2 ) \binom{x}{2} (2x)的条件。
然后每次增加1流量,跑费用流。

c o d e code code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;

const int MAXN = 100;

int n, m, m2, S, T;
int a[MAXN][MAXN], r[MAXN][MAXN], c[MAXN][MAXN], d[MAXN * MAXN];
int ans[MAXN * MAXN];
int head[MAXN * MAXN], crn[MAXN * MAXN], tot = 1, last[MAXN * MAXN];
int dis[MAXN * MAXN];
struct node {
	int to, next, w, dis;
}b[MAXN * MAXN * 2];
bool v[MAXN * MAXN];

void add(int x,int y,int w,int dis) {
	b[++ tot] = (node) {y, head[x], w, dis};
	head[x] = tot;
}

bool spfa() {
	memset(v, 0, sizeof(v));
	memset(dis, 0x3f3f3f3f3f, sizeof(dis));
	dis[S] = 0;
	queue<int> q;
	q.push(S);
	while(!q.empty()) {
		int x = q.front();
		q.pop();
		for(int i = head[x]; i; i = b[i].next) {
			int y = b[i].to;
			if(b[i].w > 0 && dis[y] > dis[x] + b[i].dis) {
				dis[y] = dis[x] + b[i].dis;
				crn[y] = x;
				last[y] = i;
				if(!v[y]) v[y] = 1, q.push(y);
			}
		}
		v[x] = 0;
	}
//	cout<<dis[T]<<endl;
	return dis[T] != 1061109567;
}

void dinic() {
	int x = 1;
	while(spfa()) {
		ans[x] = ans[x - 1] + dis[T];
//		cout<<ans[x]<<endl;
		for(int i = T; i != S; i = crn[i]) {
			b[last[i]].w --;
			b[last[i] ^ 1].w ++;
		}
		x ++;
		if(x > n * n) return ;
	}
}

int main() {
	freopen("table.in", "r", stdin);
	freopen("table.out", "w", stdout);
	scanf("%d", &n);
	for(int i = 1; i <= n; i ++) {
		string s;
		cin>>s;
		for(int j = 0; j < s.size(); j ++)
			if(s[j] == '.') a[i][j + 1] = 1;
			else a[i][j + 1] = -1;
	}
	for(int i = 1; i <= n; i ++) {
		for(int j = 1; j <= n; j ++) {
			if(a[i][j] == -1) continue;
			if(a[i][j - 1] != 1) r[i][j] = ++ m;
			else r[i][j] = r[i][j - 1];
		}
	}
	for(int j = 1; j <= n; j ++) {
		for(int i = 1; i <= n; i ++) {
			if(a[i][j] == -1) continue;
			if(a[i - 1][j] != 1) c[i][j] = ++ m2;
			else c[i][j] = c[i - 1][j];
		}
	}
	S = 0, T = m + m2 + 1; 
	for(int i = 1; i <= n; i ++)
		for(int j = 1; j <= n; j ++) {
			if(a[i][j] == -1) continue;
			add(r[i][j], c[i][j] + m, 1, 0);
			add(c[i][j] + m, r[i][j], 0, 0);
			d[r[i][j]] ++, d[c[i][j] + m] ++;
		}
	for(int i = 1; i <= m; i ++)
		for(int j = 1; j <= d[i]; j ++)
			add(S, i, 1, j - 1), add(i, S, 0, j - 1);
	for(int i = m + 1; i <= m + m2; i ++)
		for(int j = 1; j <= d[i]; j ++)
			add(i, T, 1, j - 1), add(T, i, 0, j - 1);
	dinic();
	int q;
	scanf("%d", &q);
	while(q --) {
		int x;
		scanf("%d", &x);
		printf("%d\n", ans[x]);
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【CLYZ集训】催眠大师【费用流】 的相关文章

  • 隐式方法组转换陷阱

    我想知道为什么给定代码的输出 在 LinqPad 中执行 void Main Compare1 Action Main Dump Compare2 Main Dump bool Compare1 Delegate x return x Ac
  • 泛型与接口的实际优势

    在这种情况下 使用泛型与接口的实际优势是什么 void MyMethod IFoo f void MyMethod
  • 在桌面应用程序中,类库的连接字符串存储在哪里?我可以在app.config中使用吗?

    我是桌面应用程序开发的新手 目前正在使用分层架构 用户界面 DAL BLL 构建桌面应用程序 在 Web 开发中 我曾经将连接字符串存储在 web config 中 我的类库从那里访问它 请指导我在桌面应用程序中如何以及在何处存储 DAL
  • C++ 非类型参数包扩展

    我正在编写由单一类型参数化的模板函数 并且具有可变数量的相同类型 而不是不同类型 的参数 它应该检查第一个值是否在其余值中 我想这样写 include
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • 基于 MS Bot Framework 中的响应分支对话框/表单

    我们正在尝试使用 MS Bot Framework 但尚未完全弄清楚如何实现此场景 我们有一个 LUIS 对话框 类型 它工作正常并且经过适当的培训 以常见的三明治为例 LUIS 意图寻找的基本内容是用户询问订单状态 如果问题中提供了订单号
  • 'goto *foo' 其中 foo 不是指针。这是什么?

    我正在玩标签作为值 https gcc gnu org onlinedocs gcc Labels as Values html并最终得到这段代码 int foo 0 goto foo 我的 C C 经验告诉我 foo means dere
  • C 中“for”循环中的两个变量

    我正在编写一些代码 需要在其中使用两个变量for环形 下面的代码看起来没问题吗 它确实给了我预期的结果 for loop 1 offset loop 2 offset 2 loop 1 gt offset 190 loop 2 lt 190
  • 控制器中的异常处理 (ASP.NET MVC)

    当您自己的代码抛出异常并从控制器中的操作调用时 应该如何处理 我看到很多最佳实践的例子 其中根本没有 try catch 语句 例如 从存储库访问数据 public ViewResult Index IList
  • 以标准用户身份打开默认浏览器 (C++)

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 当 ShellExecute 打开浏览器时 它似乎读取 本地管理员 配置文件而不是用户
  • 获取给定EntityType的导航属性

    我在用VS2010 EF4 0 需要如下功能 private string GetNaviProps Type entityType eg typeof Employee NorthwindEntities en new Northwind
  • 如何用C++解析复杂的字符串?

    我试图弄清楚如何使用 解析这个字符串sstream 和C 其格式为 string int int 我需要能够将包含 IP 地址的字符串的第一部分分配给 std string 以下是该字符串的示例 std string 127 0 0 1 1
  • .Net Core 中的脚手架以及解决方案中的多个项目

    我创建了一个针对 net461 的 Net Core MVC6 应用程序 我使用了一个我非常熟悉的项目结构 其中我将数据 模型和服务类放置在单独的类库项目中 并且 Web 项目引用这些项目 当我尝试搭建控制器时 我收到一条错误 指出我正在搭
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • C 的“char”使用什么字符集? [复制]

    这个问题在这里已经有答案了 简单的问题 我最近开始用 C 编程 有一个简单的问题 C 编程语言在其 char 类型中使用什么字符集 例如 ASCII 还是取决于软件 操作系统 char 本质上是 1 个字节 主要在所有操作系统上 所以默认情
  • 如何解释“错误C2018:未知字符'0x40'?[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在编译一些代码时 我收到以下信息 错误 C2018 未知字符 0x40 我想知道如何解决这样的问题 这是我要开始的地方
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • 如何使用简历实现一个“一网打尽”的异常处理程序?

    我想知道我怎样才能写一个抓住他们全部应用程序级别的异常处理程序将为用户提供恢复应用程序流程的选项 如果您正在运行 Windows 窗体应用程序 将处理程序添加到Application ThreadException event
  • 实体框架代理创建

    我们可以通过使用来停止在上下文构造函数中创建代理 this Configuration ProxyCreationEnabled false 在 EF 4 1 中创建代理有哪些优点和缺点 代理对于两个功能是必需的 延迟加载 导航属性在第一次
  • 将小数格式化为两位或整数

    对于 10 我想要 10 而不是 10 00 对于 10 11 我想要 10 11 没有代码可以实现吗 即通过指定格式字符串类似于 0 N2 decimal num 10 11M Console WriteLine num ToString

随机推荐

  • 最适合程序猿的笔记软件

    因为这几天小编要去听课 所以心血来潮找了几个适合程序猿的笔记软件 经过几天在csdn上的扒饭之后 我结合自己的某些要求 为大家整理出了这几个软件 有需要直接去后面找 一 必须支持markdown markdown的重要性不需要在这里多说了吧
  • TypeScript 联合类型(union type)

    TS是JS的超集 在JS的基础上添加了一套类型系统 这样的TS可以被静态分析带来的好处显而易见 let val string val 声明一个string类型的变量val let val string val val 1 Type numb
  • hive异常MetaException-Metastore contains multiple versions

    在执行hive运行脚本时 出现了MetaException Metastore contains multiple versions异常错误 Exception in thread main java lang RuntimeExcepti
  • Java 手动分页

    功能需求背景 今天负责短信后台定时任务时 需要定时向用户发送短信信息 但数据库记录的待发送记录数量比较大 无法一次查询出结果 需要手动分页 手动分页核心功能代码 Date now DateUtils getBeforeMouth new D
  • Arduino基本知识

    analogWrite 将一个模拟数值写进Arduino引脚 这个操作可以用来控制LED的亮度 或者控制电机的转速 Arduino每一次对引脚执行analogWrite 指令 都会给该引脚一个固定频率的PWM信号 digitalRead 读
  • 基于FPGA的图像采集之二 GEN_FRAME(成帧)模块

    距离上次的博客已经有段时间了 这写些日子一直在调SDRAM的模块以及文档的书写 SDRAM的子模块比较多 包括init 初始化模块 refresh 刷新模块 write 写模块 read 读模块 使用起来相比之前的USB控制模块 今天的GE
  • JAVA中队列,数据结构队列入队操作

    java中构造函数和构造方法的区别 Java中什么是构造函数 构造函数和普通函数的区别如下 1 写法上的不同 施工方法 Public modifier class 定义类的关键字 Test 类名 没有参数 测试 类名 接受一个参数 测试 类
  • 使用Visual Studio写一个简单的Windows窗体应用登录界面

    需要的知识 C 的基本语法 以及Visual Studio的基本操作方法 编辑软件 Sql Server 2017 Visual Studio 2017 前提 Sql Server 中有一个名为 MY LAPTOP 的服务器 一个名为 Te
  • 初学(9)——Hadoop错误:ssh: Could not resolve hostname master: Name or service not known

    进行ssh访问时出现错误 ssh Could not resolve hostname master Name or service not known 解决方法 修改hosts文件 将名称和IP建立联系 1 打开 etc目录下hosts文
  • 深入理解Go——context(2)

    文章目录 结构体 emptyCtx cancleCtx timerCtx valueCtx 结构体 emptyCtx 源码中定义了 Context 接口后 并且给出了一个实现 type emptyCtx int func emptyCtx
  • Spring Boot 实现各种参数校验

    目录 1 简单使用 1 引入依赖 2 requestBody参数校验 3 requestParam PathVariable参数校验 4 统一异常处理 2 进阶使用 1 分组校验 2 嵌套校验 3 集合校验 4 自定义校验 5 编程式校验
  • 完整的微信小程序支付开发记录(亲测)

    这次呢是开发小程序的支付功能 因为没有做过 特此记录 做一个小总结 以便以后使用以及给小伙伴们提供一个像我一样的小白一个参考 我也是一点一点摸索过来的 此文只针对开发支付流程而言以及出现的问题 其它则会略过 只讲解实际动手开发过程 名词和实
  • findbugs错误总结

    本篇是从别人那找到的 为了让我回头查看findbugs错误怎么解决而保存的 有很多问题其实挺隐晦的 比如第三条 还有人会使用 来判断常量字符串和String类型是否相等 这个就是基础不牢的缘故了 记得把findbugs尽量清零哦 1 NP
  • 简单的postgersql存储过程样例

    建表 CREATE TABLE Employees Id serial Name VARCHAR 100 DateOfBirth Date City VARCHAR 100 Designation VARCHAR 100 JoiningDa
  • 小米r3g openwrt软件源,换源

    小米r3g openwrt软件源 换源 自带的源不好用 自己找了一个 还是在中科大源站上改的 中科大这个网站上的资源太多了 ssh登录后替换 etc opkg distfeeds conf 里面的源地址 也可能是 etc opkg conf
  • 【Android】[2] 如何制作启动倒计时页

    前言 实现效果 源码地址 https github com littlecurl AppProjects 进去找AndroidCountDown或者AndroidCountDown zip进行下载 前提条件 红黑联盟 Android性能优化
  • Numpy中的排序(sort,argsort)

    按索引排序 gt gt import numpy as np gt gt x np array 0 12 48 4 14 18 1 7 99 灵活应用索引和切片实现按索引的排序 倒序的实现 普通列表也可用reverse实现 numpy则没有
  • VMware开启虚拟机无法正常开机(100%解决)

    发现自己的WMware上部署的虚拟机都无法开机 VMware Workstation 与 Device Credential Guard 不兼容 在禁用 Device Credential Guard 后 可以运行 VMware Works
  • Java做图片上传、文件上传、 批量上传、 Base64图片上传 。附上源码

    文章参考 control代码 Controller RequestMapping uploadService public class UploadServerController extends BaseController privat
  • 【CLYZ集训】催眠大师【费用流】

    题目大意 给定一个 n m n times m n m 的棋盘 棋盘上每个位置要么为空要么为障碍 定义棋盘上两个位置 x