gym105139C

题意:网格图上面有一个区域,你要用最少的不相交的矩形精确覆盖整个区域。

我们将精确覆盖看成切割,也就是将这个区域切成最少的矩形。

首先,我们将270°的角称为凹点,90°的角称为凸点,很明显我们的目标是要把全部的凹点切掉,剩下的全都是凸点,那就一定是若干个矩形。

接着就要考虑凹点的切割方法(切的任何一条边都一定有一个点是凹点,否则没有意义),两种情况:1、切的两个都是凹点;2、切的一个是凹点,另外一个是一条边。
对于情况1,我们会发现可以直接把两个凹点变成普通的凸点,不会影响区域的总点数;对于情况2,会把一个凹点转化成两个凸点。

因为我们要让最后剩下的凸点最少,所以肯定选择1会比2更加优秀,也就是找到凹点-凹点切割的最大次数,做法就是将所有的切割方法先预处理出来,因为可以分为横切和竖切,如果某个横切和某个竖切相交,就连边,因此可以建立二分图,然后跑最大独立集即可。

我们设 s 1 s_1 s1是区域顶点的总个数, s 2 s_2 s2是区域凹点的个数, s 3 s_3 s3是最大独立集大小。

那么我们切完凹点-凹点的刀以后,剩下的凹点就是 s 2 − 2 s 3 s_2-2s_3 s22s3,总顶点个数不变。

再切完剩下的凹点以后,总顶点的个数是 s 1 + 2 ( s 2 − 2 s 3 ) s_1+2(s_2-2s_3) s1+2(s22s3),因此剩下的一定是 1 4 ( s 1 + 2 s 2 − 4 s 3 ) \frac{1}{4}(s1+2s_2-4s_3) 41(s1+2s24s3)个矩形。

需要注意的是,这个顶点数计算的时候需要考虑顶点相交的矩形的情况,这种情况要顶点应该要算两个才行。

#include<bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define dwn(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
using namespace std;
template<typename T>inline void qr(T &x){x=0;int f=0;char s=getchar();while(!isdigit(s))f|=s=='-',s=getchar();while(isdigit(s))x=x*10+s-48,s=getchar();x=f?-x:x;
}
int cc=0,buf[31];
template<typename T>inline void qw(T x){if(x<0)putchar('-'),x=-x;do{buf[++cc]=int(x%10);x/=10;}while(x);while(cc)putchar(buf[cc--]+'0');
}
namespace DIC{
const int N=4e3+10,M=600*600+N*N+10;
int h[N],st,ed,cur[N];
int tot=1,hd[N],ver[M<<1],nxt[M<<1],w[M<<1];
void add(int x,int y,int z){tot++;ver[tot]=y;w[tot]=z;nxt[tot]=hd[x];hd[x]=tot;
}
void link(int x,int y,int z){add(x,y,z),add(y,x,0);
}
bool bt_h(){memset(h,0,sizeof(h));h[st]=1;queue<int>q;q.push(st);while(q.size()){int x=q.front();q.pop();for(int i=hd[x];i;i=nxt[i]){int y=ver[i];if(w[i]&&!h[y]){h[y]=h[x]+1;q.push(y);}}}return h[ed]!=0;
}
int findflow(int x,int f){if(x==ed)return f;int res=f,tt;for(int &i=cur[x];i;i=nxt[i]){int y=ver[i];if(w[i]&&h[y]==h[x]+1){tt=findflow(y,min(res,w[i]));w[i]-=tt,w[i^1]+=tt;res-=tt;if(!res)break;}}if(res==f)h[x]=0;return f-res;
}
int dicnic(){int ans=0;while(bt_h()){memcpy(cur,hd,sizeof(cur));ans+=findflow(st,1e9);}return ans;
}
}
const int N=610;
struct node{int x1,y1,x2,y2;
}a[N];int n;
int cnt,s[N];
int sum[N][N],id[N][N];
int tot1,tot2;
bool pd(int x,int y){int res=0;rep(i,-1,0)rep(j,-1,0)if(sum[x+i][y+j]>0)res++;return res==3;
}
int pd_vertex(int x,int y){int res=0;rep(i,-1,0)rep(j,-1,0)if(sum[x+i][y+j]>0)res++;if(res&1)return 1;if(!res)return 0;if(res==4)return 0;if((sum[x][y]>0)==(sum[x-1][y-1]>0))return 2;return 0;
}
void solve(){qr(n);rep(i,1,n){qr(a[i].x1),qr(a[i].y1);qr(a[i].x2),qr(a[i].y2);a[i].x2++,a[i].y2++;s[++cnt]=a[i].x1;s[++cnt]=a[i].x2;}sort(s+1,s+cnt+1);cnt=unique(s+1,s+cnt+1)-s-1;rep(i,1,n){a[i].x1=lower_bound(s+1,s+cnt+1,a[i].x1)-s;a[i].x2=lower_bound(s+1,s+cnt+1,a[i].x2)-s;}cnt=0;rep(i,1,n){s[++cnt]=a[i].y1;s[++cnt]=a[i].y2;}sort(s+1,s+cnt+1);cnt=unique(s+1,s+cnt+1)-s-1;rep(i,1,n){a[i].y1=lower_bound(s+1,s+cnt+1,a[i].y1)-s;a[i].y2=lower_bound(s+1,s+cnt+1,a[i].y2)-s;}rep(i,1,n){sum[a[i].x1][a[i].y1]++;sum[a[i].x1][a[i].y2]--;sum[a[i].x2][a[i].y1]--;sum[a[i].x2][a[i].y2]++;}rep(i,1,2*n)rep(j,1,2*n){sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];}
//    rep(i,1,10){
//      rep(j,1,10){
//        if(sum[i][j]>0)putchar('1');
//        else putchar('0');
//      }
//      puts("");
//    }rep(i,1,2*n){int last=-1;rep(j,1,2*n){if(pd(i,j)){if(last!=-1){tot1++;rep(k,last,j)id[i][k]=tot1;}else{last=j;}}if((sum[i][j]>0)+(sum[i-1][j]>0)<2)last=-1;}}rep(j,1,2*n){int last=-1;rep(i,1,2*n){if(pd(i,j)){if(last!=-1){tot2++;rep(k,last,i)if(id[k][j]){DIC::link(id[k][j],tot1+tot2,1);}}else{last=i;}}if((sum[i][j]>0)+(sum[i][j-1]>0)<2)last=-1;}}DIC::st=tot1+tot2+1;DIC::ed=DIC::st+1;rep(i,1,tot1)DIC::link(DIC::st,i,1);rep(i,1,tot2)DIC::link(tot1+i,DIC::ed,1);int R,P=0,C=0,nn=tot1+tot2-DIC::dicnic();rep(i,1,2*n)rep(j,1,2*n){P+=pd_vertex(i,j);if(pd(i,j))C++;}R=(P+2*C-4*nn)/4;qw(R);puts("");
}
int main(){int tt;tt=1;while(tt--)solve();return 0;
}

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

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

相关文章

Python网络爬虫详解:实战豆瓣电影信息采集

文章目录 前言一、爬虫是什么&#xff1f;二、常用库及其作用1.Requests2.BeautifulSoup3. lxml4. Scrapy5. Selenium6. PyQuery7. Pandas8. JSON9. Time 三、实现步骤步骤一&#xff1a;环境准备步骤二&#xff1a;数据采集步骤三&#xff1a;数据处理步骤四&#xff1a;数据存…

算法日记day 19(找树左下角的值|路径总和)

一、找树左下角的值 题目&#xff1a; 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 思路&#xff1a;…

[Windows CMD] 检测网络连通性 ping

ping 是一个非常常用的网络工具&#xff0c;用于测试网络连接的可达性和测量网络延迟。它通过发送 ICMP (Internet Control Message Protocol) Echo Request 数据包到目标主机&#xff0c;并等待接收回显应答 (Echo Reply) 来工作。ping 命令可以帮助您快速检测网络问题&#x…

LinkedList 实现 LRU 缓存

LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;缓存是一种缓存淘汰策略&#xff0c;用于在缓存满时淘汰最久未使用的元素。 关键&#xff1a; 缓存选什么结构&#xff1f; 怎么实现访问顺序&#xff1f; import java.util.*;public class LRUCac…

2021真题-架构师案例(四)

问题1&#xff08;16分&#xff09; 针对该系统功能&#xff0c;赵工建议解释器架构风格&#xff0c;李工建议管道过滤架构风格&#xff0c;王工则建议饮食调用&#xff0c;该系统从灵活性和可扩展性考虑&#xff0c;应采用哪种&#xff1f; 解析&#xff1a; 管道-过滤器&am…

lua 游戏架构 之 游戏 AI (九)ai_mgr Ai管理

定义ai_mgr的类&#xff0c;用于管理游戏中实体的AI组件。 先定义 AI行为枚举和优先级&#xff1a; lua 游戏架构 之 游戏 AI &#xff08;八&#xff09;ai_tbl 行为和优先级-CSDN博客https://blog.csdn.net/heyuchang666/article/details/140712839?spm1001.2014.3001.55…

汕头 西月 公司的面试

1&#xff1b;常用的框架&#xff0c;tp 他的特性 2&#xff1a;事务&#xff0c;的使用的场景。 3&#xff1a;redis 的使用的场景 。 4&#xff1a;redis 集合使用的场景

软设之数据库规范化理论——模式分解

数据库规范化理论之模式分解 数据库进行分解&#xff0c;一个是保持函数依赖分解 假定数据库模式Q&#xff5b;R1,R2,R3,~~~RK&#xff5d;是关系模式R的一个分解&#xff0c;F是R上的函数依赖集&#xff0c;P中的每个模式RI上的FD集是Fi。如果&#xff5b;F1,F2,~~~&#xf…

【音视频】WebRTC的简介并使用WebRTC并直播本地

文章目录 前言WebRTC 是什么WebRTC 的主要组件为什么要使用 WebRTCWebRTC 的应用示例使用ffmpeg直播本地步骤 1&#xff1a;使用 FFmpeg 录制本地桌面视频并通过 WebSocket 传输步骤 2&#xff1a;设置 WebSocket 服务器安装 Node.js 和 npm创建 WebSocket 服务器 步骤 3&#…

[原理] 可变性卷积(deformable convolution)原理及代码解释

文章目录 前言提出问题核心思想代码理解模块初始化forward过程self.p_convself._get_pself._get_x_qself._reshape_x_offset 参考文献 前言 代码见&#xff1a;https://github.com/4uiiurz1/pytorch-deform-conv-v2/blob/master/deform_conv_v2.py 论文&#xff1a;https://ar…

【数据结构】使用栈实现综合计算器

首先初始化两个栈&#xff0c;数栈&#xff08;numStack&#xff09;用于存放数据&#xff0c;符号栈&#xff08;operStack&#xff09;用于存放运算符 计算思路 1.通过一个index值&#xff08;索引&#xff09;来遍历表达式 2.如果发现扫描到一个数字&#xff0c;就直接入数栈…

Python | TypeError: ‘function’ object is not subscriptable

Python | TypeError: ‘function’ object is not subscriptable 在Python编程中&#xff0c;遇到“TypeError: ‘function’ object is not subscriptable”这一错误通常意味着你尝试像访问列表、元组、字典或字符串等可订阅&#xff08;subscriptable&#xff09;对象那样去…

Javascript面试基础6(下)

获取页面所有checkbox 怎样添加、移除、移动、复制、创建和查找节点 在JavaScript中&#xff0c;操作DOM&#xff08;文档对象模型&#xff09;是常见的任务&#xff0c;包括添加、移除、移动、复制、创建和查找节点。以下是一些基本的示例&#xff0c;说明如何执行这些操作&a…

【Python】如何修改元组的值?

一、题目 We have seen that lists are mutable (they can be changed), and tuples are immutable (they cannot be changed). Lets try to understand this with an example. You are given an immutable string, and you want to make chaneges to it. Example >>…

Java语言程序设计——篇九(2)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 枚举类型 枚举类型的定义枚举类型的方法实战演练 枚举在switch中的应用实战演练 枚举类的构造方法实战演练 枚举类型的定义 [修饰符] enum 枚举…

内部文档:如何创建、提示和示例

每个组织都拥有一定的内部知识储备&#xff0c;可以让组织不断运转、持续发展。这些知识资产对于每个企业来说都是独一无二的&#xff0c;并且高度依赖于为您工作的人员。问题是&#xff0c;这些知识常常储存在员工的头脑中。如果知识被记录下来&#xff0c;它通常隐藏在 Slack…

医院影像平台源码,C/S体系结构的C#语言PACS系统全套商业源代码

医学学影像临床信息系统具有图像采集、显示、存储、传输和管理等功能&#xff0c;支持DICOM影像设备和非DICOM影像设备&#xff0c;可以识别CT、MR、CR/DR、X光、DSA、B超、NM、SC等设备的图像类型&#xff0c;可对数字影像进行无损压缩和有损压缩处理。C/S体系结构的多媒体数据…

湖仓一体架构解析:数仓架构选择(第48天)

系列文章目录 1、Lambda 架构 2、Kappa 架构 3、混合架构 4、架构选择 5、实时数仓现状 6、湖仓一体架构 7、流批一体架构 文章目录 系列文章目录前言1、Lambda 架构2、Kappa 架构3、混合架构4、架构选择5、实时数仓现状6、湖仓一体架构7、流批一体架构 前言 本文解析了Lambd…

Verilog语言和C语言的本质区别是什么?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 用老石的一句话其实很好说…

QtQuick-QML类型系统-对象特性 (方法特性)

概念 对象类型的方法就是一个函数&#xff0c;可以执行&#xff0c;也可以和信号关联&#xff0c;这样发射信号会自动调用。 在C中&#xff0c;可以使用Q_INVOKABLE宏或者Q_SLOT宏进行注册的方式定义方法&#xff1b; 另外&#xff0c;也可以在QML文档的对象声明里使用下面的…