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. 王立平--GUI与GUILayout的差别

    GUI.Button (new Rect(0,0,5,5,"哈哈"); GUILayout.Button ("heheh"); 1.以上代码都是现实一个butt ...

  2. CSS3 animation(动画) 属性

    一.animation 1.CSS3 animation(动画) 属性 语法: animation: name duration timing-function delay iteration-cou ...

  3. Effective C++ 条款11,12 在operator= 中处理“自我赋值” || 复制对象时不要忘记每一个成分

    1.潜在的自我赋值     a[i] = a[j];     *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象, ...

  4. Vue 基础

    1. data 数据 methods 方法 watch 监听变化 2. 模版指令(类似 angular) {{}} v-text 渲染数据 v-html html 结构 3. v-if v-show ...

  5. Linux启动过程笔记

    Linux启动过程 1.启动流程(BIOS->MBR:Boot Code->引导GRUB->载入内核->运行init->runlevel) 2./boot/grub/下有 ...

  6. Hadoop如何计算map数和reduce数

    阅读本文可以带着下面问题: 1.map和reduce的数量过多会导致什么情况? 2.Reduce可以通过什么设置来增加任务个数? 3.一个task的map数量由谁来决定? 4.一个task的reduc ...

  7. Region Range

    三篇文章了解 TiDB 技术内幕 - 说存储| PingCAP https://pingcap.com/blog-cn/tidb-internal-1/ 对于一个 KV 系统,将数据分散在多台机器上有 ...

  8. SpringMVC 学习笔记(四) 处理模型数据

    Spring MVC 提供了下面几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体就可以通过该对象加入模型数据 – Map及Model: ...

  9. eclipse4.3 解决没有check out as maven project

    最近想工作之余写点测试demo,习惯了公司的开发环境,便决定自己搭建开发环境,首先是找到好用的eclipse,就是能够使用eclipse创建maven project工程,该工程能够被eclipse的 ...

  10. mysql优化-------Myisam与innodb引擎,索引文件的区别

    Myisam与innodb引擎,索引文件的区别: innodb的次索引指向对主键的引用. myisam的次索引和主索引都指向物理行. myisam一行一行的插入,会产生一行一行的文件,磁盘上有数据文件 ...