https://www.luogu.org/problemnew/show/P1034

可能是数据太水了瞎搞都可以过。

判断两个平行于坐标轴的矩形相交(含顶点与边相交)的代码一并附上。

记得这里的xy和udlr是指数学上的坐标轴。

#include<bits/stdc++.h>
using namespace std;
#define ll long long struct Point{
int x,y;
Point(int x=,int y=){
this->x=x,this->y=y;
}
}p[]; struct Rectangle{
int u,d,l,r;
Rectangle(){
u=d=l=r=-;
}
bool inside(Point p){
if(p.x>=l&&p.x<=r&&p.y>=d&&p.y<=u)
return true;
return false;
}
bool intersect_help(Rectangle r2){
Point r1p1(l,u);
if(r2.inside(r1p1))
return ;
Point r1p2(r,u);
if(r2.inside(r1p2))
return ;
Point r1p3(r,d);
if(r2.inside(r1p3))
return ;
Point r1p4(l,d);
if(r2.inside(r1p4))
return ;
return ;
} bool intersect(Rectangle r2){
if(u==-||r2.u==-)
return ;
if(intersect_help(r2))
return ;
if(r2.intersect_help(*this))
return ;
if(l<=r2.l&&r>=r2.r&&u<=r2.u&&d>=r2.d)
return ;
if(r2.l<=l&&r2.r>=r&&r2.u<=u&&r2.d>=d)
return ;
return ;
} int area(){
return (r-l)*(u-d);
} void extend(Point p){
if(u==-){
l=r=p.x;
u=d=p.y;
return;
}
else{
l=min(l,p.x);
r=max(r,p.x);
u=max(u,p.y);
d=min(d,p.y);
return;
}
} void show(){
printf(" u=%d d=%d l=%d r=%d\n",u,d,l,r);
}
}; int n,k;
int ans=0x3f3f3f3f;
void dfs4(int id,Rectangle r1,Rectangle r2,Rectangle r3,Rectangle r4){
//r1.show(),r2.show(),r3.show(),r4.show();
//printf("---------\n"); if(id>n){
ans=min(ans,r1.area()+r2.area()+r3.area()+r4.area());
return;
} Point pi=p[id];
if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi)||r4.inside(pi))
dfs4(id+,r1,r2,r3,r4);
else{
Rectangle rr1=r1;
rr1.extend(pi);
if(rr1.intersect(r2)||rr1.intersect(r3)||rr1.intersect(r4))
;
else{
dfs4(id+,rr1,r2,r3,r4);
} Rectangle rr2=r2;
rr2.extend(pi);
if(rr2.intersect(r1)||rr2.intersect(r3)||rr2.intersect(r4))
;
else{
dfs4(id+,r1,rr2,r3,r4);
} Rectangle rr3=r3;
rr3.extend(pi);
if(rr3.intersect(r1)||rr3.intersect(r2)||rr3.intersect(r4))
;
else{
dfs4(id+,r1,r2,rr3,r4);
} Rectangle rr4=r4;
rr4.extend(pi);
if(rr4.intersect(r1)||rr4.intersect(r2)||rr4.intersect(r3))
;
else{
dfs4(id+,r1,r2,r3,rr4);
}
}
} void dfs3(int id,Rectangle r1,Rectangle r2,Rectangle r3){
//r1.show(),r2.show(),r3.show();
//printf("---------\n"); if(id>n){
ans=min(ans,r1.area()+r2.area()+r3.area());
return;
} Point pi=p[id];
if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi))
dfs3(id+,r1,r2,r3);
else{
Rectangle rr1=r1;
rr1.extend(pi);
if(rr1.intersect(r2)||rr1.intersect(r3))
;
else{
dfs3(id+,rr1,r2,r3);
} Rectangle rr2=r2;
rr2.extend(pi);
if(rr2.intersect(r1)||rr2.intersect(r3))
;
else{
dfs3(id+,r1,rr2,r3);
} Rectangle rr3=r3;
rr3.extend(pi);
if(rr3.intersect(r1)||rr3.intersect(r2))
;
else{
dfs3(id+,r1,r2,rr3);
}
}
} void dfs2(int id,Rectangle r1,Rectangle r2){
if(id>n){
//r1.show(),r2.show();
int tans=r1.area()+r2.area();
ans=min(ans,tans);
//printf("tans=%d\n---------\n",tans);
return;
} Point pi=p[id];
if(r1.inside(pi)||r2.inside(pi))
dfs2(id+,r1,r2);
else{
Rectangle rr1=r1;
rr1.extend(pi);
if(rr1.intersect(r2))
;
else{
dfs2(id+,rr1,r2);
} Rectangle rr2=r2;
rr2.extend(pi);
if(rr2.intersect(r1))
;
else{
dfs2(id+,r1,rr2);
}
}
} void dfs(int id,Rectangle r1){
//r1.show();
//printf("---------\n"); if(id>n){
ans=min(ans,r1.area());
return;
} Point pi=p[id];
if(r1.inside(pi))
dfs(id+,r1);
else{
Rectangle rr1=r1;
rr1.extend(pi);
dfs(id+,rr1);
}
} int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
Rectangle r;
switch(k){
case :
dfs(,r);
break;
case :
dfs2(,r,r);
break;
case :
dfs3(,r,r,r);
break;
case :
dfs4(,r,r,r,r);
}
printf("%d\n",ans);
}

加入最优性剪枝:22ms,快了3倍?

#include<bits/stdc++.h>
using namespace std;
#define ll long long struct Point{
int x,y;
Point(int x=,int y=){
this->x=x,this->y=y;
}
}p[]; struct Rectangle{
int u,d,l,r;
Rectangle(){
u=d=l=r=-;
}
bool inside(Point p){
if(p.x>=l&&p.x<=r&&p.y>=d&&p.y<=u)
return true;
return false;
}
bool intersect_help(Rectangle r2){
Point r1p1(l,u);
if(r2.inside(r1p1))
return ;
Point r1p2(r,u);
if(r2.inside(r1p2))
return ;
Point r1p3(r,d);
if(r2.inside(r1p3))
return ;
Point r1p4(l,d);
if(r2.inside(r1p4))
return ;
return ;
} bool intersect(Rectangle r2){
if(u==-||r2.u==-)
return ;
if(intersect_help(r2))
return ;
if(r2.intersect_help(*this))
return ;
if(l<=r2.l&&r>=r2.r&&u<=r2.u&&d>=r2.d)
return ;
if(r2.l<=l&&r2.r>=r&&r2.u<=u&&r2.d>=d)
return ;
return ;
} int area(){
return (r-l)*(u-d);
} void extend(Point p){
if(u==-){
l=r=p.x;
u=d=p.y;
return;
}
else{
l=min(l,p.x);
r=max(r,p.x);
u=max(u,p.y);
d=min(d,p.y);
return;
}
} void show(){
printf(" u=%d d=%d l=%d r=%d\n",u,d,l,r);
}
}; int n,k;
int ans=0x3f3f3f3f;
void dfs4(int id,Rectangle r1,Rectangle r2,Rectangle r3,Rectangle r4){
//r1.show(),r2.show(),r3.show(),r4.show();
//printf("---------\n");
int tans=r1.area()+r2.area()+r3.area()+r4.area();
if(tans>=ans)
return;
if(id>n){
ans=min(ans,tans);
return;
} Point pi=p[id];
if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi)||r4.inside(pi))
dfs4(id+,r1,r2,r3,r4);
else{
Rectangle rr1=r1;
rr1.extend(pi);
if(rr1.intersect(r2)||rr1.intersect(r3)||rr1.intersect(r4))
;
else{
dfs4(id+,rr1,r2,r3,r4);
} Rectangle rr2=r2;
rr2.extend(pi);
if(rr2.intersect(r1)||rr2.intersect(r3)||rr2.intersect(r4))
;
else{
dfs4(id+,r1,rr2,r3,r4);
} Rectangle rr3=r3;
rr3.extend(pi);
if(rr3.intersect(r1)||rr3.intersect(r2)||rr3.intersect(r4))
;
else{
dfs4(id+,r1,r2,rr3,r4);
} Rectangle rr4=r4;
rr4.extend(pi);
if(rr4.intersect(r1)||rr4.intersect(r2)||rr4.intersect(r3))
;
else{
dfs4(id+,r1,r2,r3,rr4);
}
}
} void dfs3(int id,Rectangle r1,Rectangle r2,Rectangle r3){
//r1.show(),r2.show(),r3.show();
//printf("---------\n");
int tans=r1.area()+r2.area()+r3.area();
if(tans>=ans)
return; if(id>n){
ans=min(ans,tans);
return;
} Point pi=p[id];
if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi))
dfs3(id+,r1,r2,r3);
else{
Rectangle rr1=r1;
rr1.extend(pi);
if(rr1.intersect(r2)||rr1.intersect(r3))
;
else{
dfs3(id+,rr1,r2,r3);
} Rectangle rr2=r2;
rr2.extend(pi);
if(rr2.intersect(r1)||rr2.intersect(r3))
;
else{
dfs3(id+,r1,rr2,r3);
} Rectangle rr3=r3;
rr3.extend(pi);
if(rr3.intersect(r1)||rr3.intersect(r2))
;
else{
dfs3(id+,r1,r2,rr3);
}
}
} void dfs2(int id,Rectangle r1,Rectangle r2){
int tans=r1.area()+r2.area();
if(tans>=ans)
return; if(id>n){
//r1.show(),r2.show();
ans=min(ans,tans);
//printf("tans=%d\n---------\n",tans);
return;
} Point pi=p[id];
if(r1.inside(pi)||r2.inside(pi))
dfs2(id+,r1,r2);
else{
Rectangle rr1=r1;
rr1.extend(pi);
if(rr1.intersect(r2))
;
else{
dfs2(id+,rr1,r2);
} Rectangle rr2=r2;
rr2.extend(pi);
if(rr2.intersect(r1))
;
else{
dfs2(id+,r1,rr2);
}
}
} void dfs(int id,Rectangle r1){
//r1.show();
//printf("---------\n");
int tans=r1.area();
if(tans>=ans)
return; if(id>n){
ans=min(ans,r1.area());
return;
} Point pi=p[id];
if(r1.inside(pi))
dfs(id+,r1);
else{
Rectangle rr1=r1;
rr1.extend(pi);
dfs(id+,rr1);
}
} int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
Rectangle r;
switch(k){
case :
dfs(,r);
break;
case :
dfs2(,r,r);
break;
case :
dfs3(,r,r,r);
break;
case :
dfs4(,r,r,r,r);
}
printf("%d\n",ans);
}

洛谷 - P1034 - 矩形覆盖 - dfs的更多相关文章

  1. 洛谷P1034 矩形覆盖

    P1034 矩形覆盖 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4( ...

  2. 洛谷 P1034 矩形覆盖

    P1034 矩形覆盖 题目描述 在平面上有nn个点(n \le 50n≤50),每个点用一对整数坐标表示.例如:当 n=4n=4 时,44个点的坐标分另为:p_1p1​(1,11,1),p_2p2​( ...

  3. [NOIP2002] 提高组 洛谷P1034 矩形覆盖

    题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...

  4. 洛谷——P1034 矩形覆盖

    https://www.luogu.org/problem/show?pid=1034 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的 ...

  5. 【NOIP2002】矩形覆盖 DFS

    首先,我喜欢愤怒搜索,因为尽管说K<=4,的确K小于或等于3的. 当然某些K<=3还600ms的我就不加评论了. 好吧,可是怎么搜呢?我们考虑到矩形数量非常少,所以能够怒搜矩形. 一些神做 ...

  6. 洛谷 P2218 [HAOI2007]覆盖问题 解题报告

    P2218 [HAOI2007]覆盖问题 题目描述 某人在山上种了\(N\)棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他 ...

  7. P1034 矩形覆盖

    题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...

  8. 洛谷 P1191 矩形 题解

    P1191 矩形 题目描述 给出一个 \(n \times n\)的矩阵,矩阵中,有些格子被染成白色,有些格子被染成黑色,现要求矩阵中白色矩形的数量 输入格式 第一行,一个整数\(n\),表示矩形的大 ...

  9. 洛谷P1120小木棍[DFS]

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

随机推荐

  1. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

  2. 前端高频面试题 CSS篇

    通过从网上看到的面经,总结的一些高频的前端CSS面试题,有很多不会,于是找资料,并通过代码实现,自己提供了一些参考答案. 目录 1.怎样会产生浮动? 2.如何清除浮动? 3.盒子模型,以及IE和其他浏 ...

  3. [WASM] Set up wasm-bindgen for easy Rust/JavaScript Interoperability

    Interoperability between JavaScript and Rust is limited to numerics and accessing memory directly. S ...

  4. 【转载】Http协议与TCP协议简单理解

    在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...

  5. PHP内核探索:内存管理开篇

    内存是计算机非常关键的部件之一,是暂时存储程序以及数据的空间,CPU只有有限的寄存器可以用于存储计算数据,而大部分的数据都是存储在内存中的,程序运行都是在内存中进行的.和CPU计算能力一样, 内存也是 ...

  6. openwrt mt7620 内存大小检测

    单独编译内核: make V=s target/linux/install 相调函数调用流程: init/main.c : start_kernel() -> setup_arch(&c ...

  7. Arcgis Engine(ae)接口详解(4):featureClass的feature插入

    //由于测试数据不完善,featureClass在此要只设null值,真实功能要设实际的值 IFeatureClass featureClass = null; //获取某个字段的索引,后面取字段值用 ...

  8. 【php】读取&quot;文件列表&quot;按时间倒序显示,并递归显示各层文件夹、!

    思路: 1.读取该php所在文件夹的文件列表,用"改动时间.文件名称"做键值对,塞入数组.对"改动时间"倒序.(貌似不能直接按时间倒序读取文件列表,此处为间接方 ...

  9. Ctrl+Enter 选中文本提交

    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <bod ...

  10. Linux 及 CentOS系统安装

    VMware与Centos系统安装   今日任务 .Linux发行版的选择 .vmware创建一个虚拟机(centos) .安装配置centos7 .xshell配置连接虚拟机(centos) 选择性 ...