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. [CSS3] Define Form Element States with CSS Form Pseudo Classes

    Using just semantic CSS Pseudo-Classes you can help define important states for form elements that e ...

  2. Solidworks如何绘制文字

    1 新建草图,并点击工具-草图绘制实体,文本   2 在弹出的窗口中输入文字,并设置文字的字体和样式   3 画好之后效果如下图所示   4 使用拉伸或者拉升切除来得到凸面的文字或者凹面的文字.   ...

  3. HTML小知识点积累

    1.怎样让heigth:100%起效?   有时候我们设置heigth:100%,想让当前控件铺满整个屏幕,可是非常少情况下这个属性能达到我们想要的效果,这是为什么呢?   而依据W3C的规范.百分比 ...

  4. 小程序 - Template

    关于模板,参见:https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/template.html 引入模块 <import ...

  5. react 创建组件 (三)PureComponet

    我们知道,当组件的props或者state发生变化的时候:React会对组件当前的Props和State分别与nextProps和nextState进行比较,当发现变化时,就会对当前组件以及子组件进行 ...

  6. EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体server,EasyPlayer手机播放器

    在不断进行EasyDarwin开源流媒体server的功能和性能完好的同一时候,我们也配套实现了眼下在安防和移动互联网行业比較火热的移动端手机直播方案,主要就是我们的 EasyPusher直播推送项目 ...

  7. 解决Sql server分页时第二页以上查询结果不正常的问题

    有100个产品,其中最高价格的为200元,而200元的产品共有40个, 现在好了,对每页30进行分页: declare @PageSize int--30 declare @Page int decl ...

  8. plsql 无需配置客户端连接.

    plsql 无需配置客户端连接. (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.5)(PORT=1521)))(C ...

  9. 民大OJ 1668 追杀系列第二发

    追杀系列第二发 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 57            测试通过 : 16 ...

  10. MD5介绍及Windows下对文件做md5校验。

    MD5介绍参考百度百科: 摘要如下: MD5 校验和(checksum)通过对接收的传输数据执行散列运算来检查数据的正确性. 一个散列函数,比如 MD5,是一个将任意长度的数据字符串转化成短的固定长度 ...