8.29T2 国际象棋(构造:棋盘拆分成小方阵)

news2024/11/16 15:32:28

http://cplusoj.com/d/senior/p/NODSX2303B

暴力显然,因为肯定是从奇点到偶点,所以二分图匹配一下就好

首先我们手模一下,比如(11,11),我们可以手模出一个情况,也就是DInic跑出来的情况:

在这里插入图片描述

看起来很有规律,但却很难分析,那让我们看另一种方法:

在这里插入图片描述

是不是看起来没有什么规律?其实不然:

在这里插入图片描述

是了!这种拆分方式好像分成了一个个方阵,而方阵之间是独立的!

更厉害的是,只有右下角会有1个0,其他都没有0

更厉害的是,其他方阵至少有1条边长为4,而手玩一下边长为4的方阵是无敌的!

那我们就做完了!直接按4来划分。最后如果余1或余2就很前面或左边的合并一下即可

#include<bits/stdc++.h>
using namespace std;
#ifdef LOCAL
 #define debug(...) fprintf(stdout, ##__VA_ARGS__)
 #define debag(...) fprintf(stderr, ##__VA_ARGS__)
#else
 #define debug(...) void(0)
 #define debag(...) void(0)
#endif
//#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
#define fi first
#define se second
//#define M
//#define mo
#define N 1010
int n, m, i, j, k, T;
int dx[8] = {-1, -2, -2, -1, 1, 2, 2, 1}; 
int dy[8] = {-2, -1, 1, 2, 2, 1, -1, -2}; 
int TOT, l1, l2; 
struct node {
	int xi, xj, yi, yj; 
};
vector<node> V[10][10], Ans; 
int a[N][N]; 

namespace Flow {
	#define int long long
	struct mf_graph {
		struct node {
			int x, y, z, n; 
		}; 
		vector<node>d; 
		vector<int>h, H, dep; 
		queue<int>q; 
		int k; 
		int u, v, w, S, T, ans=0; 
		void reset(int n) {
			h.clear(); d.clear(); H.clear(); dep.clear(); 
			h.resize(n+5); k=1; d.resize(2); 
			H.resize(n+5); dep.resize(n+5); 
		}
		void cun(int x, int y, int z) {
			++k; d.pb({x, y, z, h[x]}); 
			d[k].n=h[x]; h[x]=k;
		}
		void print(int n, int m) {
			for(auto t : d) if(t.x && t.y && !t.z) {
				if(t.x == S || t.y == S || t.x == T || t.y == T) continue; 
				int xi = t.x / m + 1, xj = t.x % m; if(xj == 0) --xi, xj = m; 
				int yi = t.y / m + 1, yj = t.y % m; if(yj == 0) --yi, yj = m; 
				if((xi + xj) & 1) {
					V[n][m].pb({xi, xj, yi, yj}); 
//					printf("%lld %lld %lld %lld\n", xi, xj, yi, yj); 
				}
			}
		}
		void add_edge(int x, int y, int z) {
			cun(x, y, z); cun(y, x, 0); 
		}
		int bfs() {
			while(!q.empty()) q.pop(); 
			fill(dep.begin(), dep.end(), -1); 
			h=H; 
			dep[S]=1; q.push(S); 
			while(!q.empty()) {
				u=q.front(); q.pop(); 
				for(int g=h[u]; g; g=d[g].n) {
					v=d[g].y; w=d[g].z; 
					if(w<=0 || dep[v]!=-1) continue; 
					dep[v]=dep[u]+1; q.push(v); 
				}
			}
			return dep[T]!=-1; 
		}
		int dfs(int x, int w) {
			if(x==T) return w;
			if(!w) return 0; 
			int ans=0, s; 
			for(int &i=h[x]; i; i=d[i].n) {
				int y=d[i].y, z=d[i].z;  
				if(dep[y]!=dep[x]+1) continue; 
				if(z<=0) continue; 
				s=dfs(y, min(w, z)); ans+=s; w-=s; 
				d[i].z-=s; d[i^1].z+=s; 
				if(!w) break;  
			}
			return ans; 
		}
		int flow(int SS, int TT) {
			S=SS; T=TT; H=h; ans=0; 
			while(bfs()) ans+=dfs(S, 1e18); 
			return ans; 
		}
	}; 	
	#undef int
}
using namespace Flow; 
int SS, TT, x, y; 

int zh(int x, int y) {
	return (x - 1) * m + y; 
}

void print(int bn, int bm, int n, int m, int o = 0) {
	for(auto t : V[n][m]) {
		int xi = t.xi + bn - 1, xj = t.xj + bm - 1, yi = t.yi + bn - 1, yj = t.yj + bm - 1; 
		a[xi][xj] = a[yi][yj] = ++TOT; 
		if(o) Ans.pb({xi, xj, yi, yj}); 
		if(!o) printf("%d %d %d %d\n", xi, xj, yi, yj); 
	}
}

signed main()
{
	#ifdef LOCAL
	  freopen("in.txt", "r", stdin);
	  freopen("out.txt", "w", stdout);
	#endif
//	srand(time(NULL));
	for(n = 1; n <= 7; ++n)
		for(m = 1; m <= 7; ++m) {
			TOT = 0; 
			mf_graph G; G.reset(n * m + 2); 
			SS = n * m + 1; TT = SS + 1; 
			for(i = 1; i <= n; ++i)	
				for(j = 1; j <= m; ++j) {
					if((i + j) & 1) {
						G.add_edge(SS, zh(i, j), 1); 
						for(k = 0; k < 8; ++k) {
							x = i + dx[k]; y = j + dy[k]; 
							if(x < 1 || y < 1 || x > n || y > m) continue; 
							G.add_edge(zh(i, j), zh(x, y), 1); 
						}
					}
					else G.add_edge(zh(i, j), TT, 1);
				}
			k = G.flow(SS, TT); 
			G.print(n, m); 
		}
	T = read(); 
	while(T--) {
		n = read(); m = read(); Ans.clear(); TOT = 0; 
		if(n == 1 || m == 1) { printf("0\n"); continue; }
		for(i = 1; i <= n; ++i) for(j = 1; j <= m; ++j) a[i][j] = 0; 
		if(n == 2) {
			for(i = 1; i <= m; i += 4) {
				l1 = 4; 
				if(i + 2 > m) continue; 
				if(i + 2 == m) l1 = 3; 
				if(i + 5 >= m) l1 = m - i + 1; 
				print(1, i, 2, l1, 1); 
			}
			printf("%d\n", Ans.size()); 
			for(auto t : Ans) printf("%d %d %d %d\n", t.xi, t.xj, t.yi, t.yj); 
			for(i = 1; i <= n; ++i, debug("\n")) for(j = 1; j <= m; ++j) debug("%3d ", a[i][j]); 
			continue; 
		}
		if(m == 2) {
			for(i = 1; i <= n; i += 4) {
				l1 = 4; 
				if(i + 2 > n) continue; 
				if(i + 2 == n) l1 = 3; 
				if(i + 5 >= n) l1 = n - i + 1; 
				print(i, 1, l1, 2, 1); 
			}
			printf("%d\n", Ans.size()); 
			for(auto t : Ans) printf("%d %d %d %d\n", t.xi, t.xj, t.yi, t.yj); 
			for(i = 1; i <= n; ++i, debug("\n")) for(j = 1; j <= m; ++j) debug("%3d ", a[i][j]); 
			continue; 
		}
		printf("%d\n", n * m / 2); 
		for(i = 1; i <= n; i += 4)
			for(j = 1; j <= m; j += 4) {
				l1 = l2 = 4; 
				if(i + 2 > n) continue; 
				if(j + 2 > m) continue; 
				if(i + 2 == n) l1 = 3; 
				if(j + 2 == m) l2 = 3; 
				if(i + 5 >= n) l1 = n - i + 1; 
				if(j + 5 >= m) l2 = m - j + 1; 
//				debug("[%d %d] (%d %d)\n", i, j, l1, l2); 
				print(i, j, l1, l2); 
			}
		for(i = 1; i <= n; ++i, debug("\n")) for(j = 1; j <= m; ++j) debug("%3d ", a[i][j]); 
	}

	return 0;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

培训第三十九天(了解docker-compose,docker-compose编排容器,配置harbor服务)

一、回顾 1、拉取私有仓库镜像 # 配置dockerdocker pull 10.0.0.10:5000/centosnginx:v0 2、容器网络类型 brideg(net) default# docker启动之后会生成新的虚拟网卡&#xff0c;网卡的名称docker0# 网段默认是172.17.0.1# 所有的容器都桥接docker0&#xff0c;通过桥接共享网…

对物料分别评估

业务示例 在公司中&#xff0c;某些物料是同时在内部进行生产和在外部进行采购的。由于必须根据值区分内部零件和外部零件&#xff0c;因此应为这些物料设置分别评估。 有关工厂内的评估&#xff0c;可使用分别评估根据特定标准区分物料的部分库存&#xff0c;并且可以不同方…

Python画笔案例-019 绘制阴影丫字

1、绘制阴影丫字 通过 python 的turtle 库绘制一个阴影丫字的图案&#xff0c;如下图&#xff1a; 2、实现代码 绘制一个阴影丫字图&#xff0c;以下为实现代码&#xff1a; """阴影丫字.py """ import turtleturtle.delay(0) turtle.speed(0)d…

Linux —— 驱动——platform平台总线

platform平台总线是Linux内核中一个重要的概念&#xff0c;主要用于管理那些不通过传统物理总线&#xff08;如USB、I2C、SPI等&#xff09;连接的设备&#xff0c;特别是SoC&#xff08;System on Chip&#xff0c;片上系统&#xff09;内部集成的外设。以下是对platform平台总…

mysql8.0查询等级排名可使用窗口函数,那5.7的版本呢?

1、需求&#xff1a;查询用户详情的同时查询用户的排名 2、首先看下数据库表设计 分为会员用户表member_user和会员等级表member_level&#xff0c;升级的条件是根据经验值升级&#xff0c;表结构如下&#xff1a; 用户表 member_user CREATE TABLE member_user (id bigint(…

C#操作ms office实现office转pdf

前提 安装office 2019 安装vs 2022 新建项目 引入4个com包 编写代码 代码结构 代码如下 using Microsoft.Office.Interop.Excel;namespace UseMsOffice {internal class Program{static void Main(string[] args){WordToPdf();ExcelToPdf();PPTToPdf();}static void W…

SpringBoot3与AOP完美结合:轻松追踪用户操作,实现精准日志记录

程序员必备宝典https://tmxkj.top/#/ 1.pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.alibaba</groupId&g…

LlamaIndex 实现 Agent

RAG 是在数据层面为大模型提供更多、更新的外部知识&#xff0c;而 Agent &#xff08;智能体&#xff09;&#xff0c;为大模型扩展了推理业务的能力。数据是静态的&#xff0c;数据周期可能是天、小时甚至到秒&#xff0c;通过 RAG 实现时&#xff0c;需要调用对应系统的 API…

uni-app组件

一. 什么是组件,有什么好处? 在uni-app中&#xff0c;组件是构成应用的基本单位&#xff0c;它们是用来定义用户界面的一部分&#xff0c;并且通常包含了视图和逻辑。组件的设计使得开发者能够以声明式的方式构建应用界面&#xff0c;并且通过组件化的开发方式来提高代码的复…

vue-cli搭建项目过程

一.前言 传统的前端项目架构&#xff1a; 指的就是一个项目中有很多个HTML文件&#xff0c;每一个HTML文件都是相互独立的&#xff0c;如果需要在页面中导入一些外部依赖的css,js文件&#xff0c;就需要在每一个html文件中都导入就会显得特别麻烦&#xff0c;而且这些外部依赖…

详细git使用教程以及git base here命令行

0 下载 这个是官网下载特别慢 Git - Downloads (git-scm.com) 1 最基本操作与初始配置 1.1&#xff0c;linux的基本命令可用 下载安装后鼠标右键选git base here即可打开 1.2&#xff0c;git init /git clone初始化&#xff0c;创建本地仓库 出现.git隐藏文件 git clone “…

Big Model Weekly | 第34期

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 01 MiniCPM-V: A GPT-4V Level MLLM on Your Phone 近期多模态大型语言模型&#xff08;MLLMs&#xff09;的快速发展&#xff0c;从根本上改变了人工智能研究和产业的格局&#xff0c;为实现人工智能的下一个重…

Java去掉字符串中的特殊符号只保留中文数字和字母

今天在做一个导入功能发现用户导入的数据有特殊符号&#xff0c;于是想着给他去掉&#xff0c;搜了一下发现大多数方法都只保留了字母数字&#xff0c;连中文都去掉了&#xff0c;这很明显不符合我的需求 直接上代码 /*** author Sakura* date 2024/8/27 15:18*/ public clas…

Python(C++)自动微分导图

&#x1f3af;要点 反向传播矢量化计算方式前向传递和后向传递计算方式图节点拓扑排序一阶二阶前向和伴随模式计算二元分类中生成系数高斯噪声和特征二元二次方程有向无环计算图超平面搜索前向梯度下降算法快速傅里叶变换材料应力和切线算子GPU CUDA 神经网络算术微分 Pytho…

使用谷歌浏览器查看原型

需求人员给了一个原型文件包&#xff0c;用谷歌浏览器打开提示以下内容&#xff1a; 找到需求人员发的原型文件包 进入到resources-->chrome&#xff0c;找到axure-chrome-extension.crx&#xff0c;复制一份出来命名为axure-chrome-extension.tar&#xff0c;然后在该目录下…

招联金融基于 Apache Doris 数仓升级:单集群 QPS 超 10w,存储成本降低 70%

在竞争激烈的消费金融市场中&#xff0c;有效利用海量数据、提升业务运营效率是赢得市场的关键。早期招联采用典型的 Lambda 架构提供业务报表、数据运营、个性推荐、风险控制等数据服务&#xff0c;而 Lambda 过多的技术栈也引发了数据孤岛、查询效率不足、代码复用性差以及开…

AI算法平台训练站裸土检测算法训练裸土检测算法源码

在全球化进程加快与环境问题日益突出的今天&#xff0c;裸土检测成为了环境监测和土壤管理中不可或缺的一环。裸土指的是没有植被覆盖的土壤区域&#xff0c;这些区域易受侵蚀&#xff0c;并可能导致土壤流失和环境退化。为了有效应对这些问题&#xff0c;裸土检测算法应运而生…

Redis持久化与主从同步

1 淘汰策略 127.0.0.1:6379> help expireEXPIRE key secondssummary: Set a keys time to live in secondssince: 1.0.0group: generic127.0.0.1:6379> help PEXPIREPEXPIRE key millisecondssummary: Set a keys time to live in millisecondssince: 2.6.0group: gener…

【CSP:202112-1】序列查询(Java)

题目链接 202112-1 序列查询 题目描述 求解思路 模拟&#xff1a;a数组可以看作是记录 f ( x ) f(x) f(x) 函数值发生变化出的 x x x 点&#xff08;每次自增1&#xff09;。因此将每段相同数值的 f ( x ) f(x) f(x) 用乘法计算出来即可&#xff0c;最后记得要加上最后一…

Java Web —— 第九天(事务)

事务管理 & AOP 事务回顾 概念 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;这些操作 要么同时成功&#xff0c;要么同时失败 操作 开启事务(一组操作开始前&#xff0c;开启事务): start transaction / begin 提交事务(这组操作全部成功…