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

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

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

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4.  
  5. struct Point{
  6. int x,y;
  7. Point(int x=,int y=){
  8. this->x=x,this->y=y;
  9. }
  10. }p[];
  11.  
  12. struct Rectangle{
  13. int u,d,l,r;
  14. Rectangle(){
  15. u=d=l=r=-;
  16. }
  17. bool inside(Point p){
  18. if(p.x>=l&&p.x<=r&&p.y>=d&&p.y<=u)
  19. return true;
  20. return false;
  21. }
  22. bool intersect_help(Rectangle r2){
  23. Point r1p1(l,u);
  24. if(r2.inside(r1p1))
  25. return ;
  26. Point r1p2(r,u);
  27. if(r2.inside(r1p2))
  28. return ;
  29. Point r1p3(r,d);
  30. if(r2.inside(r1p3))
  31. return ;
  32. Point r1p4(l,d);
  33. if(r2.inside(r1p4))
  34. return ;
  35. return ;
  36. }
  37.  
  38. bool intersect(Rectangle r2){
  39. if(u==-||r2.u==-)
  40. return ;
  41. if(intersect_help(r2))
  42. return ;
  43. if(r2.intersect_help(*this))
  44. return ;
  45. if(l<=r2.l&&r>=r2.r&&u<=r2.u&&d>=r2.d)
  46. return ;
  47. if(r2.l<=l&&r2.r>=r&&r2.u<=u&&r2.d>=d)
  48. return ;
  49. return ;
  50. }
  51.  
  52. int area(){
  53. return (r-l)*(u-d);
  54. }
  55.  
  56. void extend(Point p){
  57. if(u==-){
  58. l=r=p.x;
  59. u=d=p.y;
  60. return;
  61. }
  62. else{
  63. l=min(l,p.x);
  64. r=max(r,p.x);
  65. u=max(u,p.y);
  66. d=min(d,p.y);
  67. return;
  68. }
  69. }
  70.  
  71. void show(){
  72. printf(" u=%d d=%d l=%d r=%d\n",u,d,l,r);
  73. }
  74. };
  75.  
  76. int n,k;
  77. int ans=0x3f3f3f3f;
  78. void dfs4(int id,Rectangle r1,Rectangle r2,Rectangle r3,Rectangle r4){
  79. //r1.show(),r2.show(),r3.show(),r4.show();
  80. //printf("---------\n");
  81.  
  82. if(id>n){
  83. ans=min(ans,r1.area()+r2.area()+r3.area()+r4.area());
  84. return;
  85. }
  86.  
  87. Point pi=p[id];
  88. if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi)||r4.inside(pi))
  89. dfs4(id+,r1,r2,r3,r4);
  90. else{
  91. Rectangle rr1=r1;
  92. rr1.extend(pi);
  93. if(rr1.intersect(r2)||rr1.intersect(r3)||rr1.intersect(r4))
  94. ;
  95. else{
  96. dfs4(id+,rr1,r2,r3,r4);
  97. }
  98.  
  99. Rectangle rr2=r2;
  100. rr2.extend(pi);
  101. if(rr2.intersect(r1)||rr2.intersect(r3)||rr2.intersect(r4))
  102. ;
  103. else{
  104. dfs4(id+,r1,rr2,r3,r4);
  105. }
  106.  
  107. Rectangle rr3=r3;
  108. rr3.extend(pi);
  109. if(rr3.intersect(r1)||rr3.intersect(r2)||rr3.intersect(r4))
  110. ;
  111. else{
  112. dfs4(id+,r1,r2,rr3,r4);
  113. }
  114.  
  115. Rectangle rr4=r4;
  116. rr4.extend(pi);
  117. if(rr4.intersect(r1)||rr4.intersect(r2)||rr4.intersect(r3))
  118. ;
  119. else{
  120. dfs4(id+,r1,r2,r3,rr4);
  121. }
  122. }
  123. }
  124.  
  125. void dfs3(int id,Rectangle r1,Rectangle r2,Rectangle r3){
  126. //r1.show(),r2.show(),r3.show();
  127. //printf("---------\n");
  128.  
  129. if(id>n){
  130. ans=min(ans,r1.area()+r2.area()+r3.area());
  131. return;
  132. }
  133.  
  134. Point pi=p[id];
  135. if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi))
  136. dfs3(id+,r1,r2,r3);
  137. else{
  138. Rectangle rr1=r1;
  139. rr1.extend(pi);
  140. if(rr1.intersect(r2)||rr1.intersect(r3))
  141. ;
  142. else{
  143. dfs3(id+,rr1,r2,r3);
  144. }
  145.  
  146. Rectangle rr2=r2;
  147. rr2.extend(pi);
  148. if(rr2.intersect(r1)||rr2.intersect(r3))
  149. ;
  150. else{
  151. dfs3(id+,r1,rr2,r3);
  152. }
  153.  
  154. Rectangle rr3=r3;
  155. rr3.extend(pi);
  156. if(rr3.intersect(r1)||rr3.intersect(r2))
  157. ;
  158. else{
  159. dfs3(id+,r1,r2,rr3);
  160. }
  161. }
  162. }
  163.  
  164. void dfs2(int id,Rectangle r1,Rectangle r2){
  165. if(id>n){
  166. //r1.show(),r2.show();
  167. int tans=r1.area()+r2.area();
  168. ans=min(ans,tans);
  169. //printf("tans=%d\n---------\n",tans);
  170. return;
  171. }
  172.  
  173. Point pi=p[id];
  174. if(r1.inside(pi)||r2.inside(pi))
  175. dfs2(id+,r1,r2);
  176. else{
  177. Rectangle rr1=r1;
  178. rr1.extend(pi);
  179. if(rr1.intersect(r2))
  180. ;
  181. else{
  182. dfs2(id+,rr1,r2);
  183. }
  184.  
  185. Rectangle rr2=r2;
  186. rr2.extend(pi);
  187. if(rr2.intersect(r1))
  188. ;
  189. else{
  190. dfs2(id+,r1,rr2);
  191. }
  192. }
  193. }
  194.  
  195. void dfs(int id,Rectangle r1){
  196. //r1.show();
  197. //printf("---------\n");
  198.  
  199. if(id>n){
  200. ans=min(ans,r1.area());
  201. return;
  202. }
  203.  
  204. Point pi=p[id];
  205. if(r1.inside(pi))
  206. dfs(id+,r1);
  207. else{
  208. Rectangle rr1=r1;
  209. rr1.extend(pi);
  210. dfs(id+,rr1);
  211. }
  212. }
  213.  
  214. int main(){
  215. scanf("%d%d",&n,&k);
  216. for(int i=;i<=n;i++){
  217. scanf("%d%d",&p[i].x,&p[i].y);
  218. }
  219. Rectangle r;
  220. switch(k){
  221. case :
  222. dfs(,r);
  223. break;
  224. case :
  225. dfs2(,r,r);
  226. break;
  227. case :
  228. dfs3(,r,r,r);
  229. break;
  230. case :
  231. dfs4(,r,r,r,r);
  232. }
  233. printf("%d\n",ans);
  234. }

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4.  
  5. struct Point{
  6. int x,y;
  7. Point(int x=,int y=){
  8. this->x=x,this->y=y;
  9. }
  10. }p[];
  11.  
  12. struct Rectangle{
  13. int u,d,l,r;
  14. Rectangle(){
  15. u=d=l=r=-;
  16. }
  17. bool inside(Point p){
  18. if(p.x>=l&&p.x<=r&&p.y>=d&&p.y<=u)
  19. return true;
  20. return false;
  21. }
  22. bool intersect_help(Rectangle r2){
  23. Point r1p1(l,u);
  24. if(r2.inside(r1p1))
  25. return ;
  26. Point r1p2(r,u);
  27. if(r2.inside(r1p2))
  28. return ;
  29. Point r1p3(r,d);
  30. if(r2.inside(r1p3))
  31. return ;
  32. Point r1p4(l,d);
  33. if(r2.inside(r1p4))
  34. return ;
  35. return ;
  36. }
  37.  
  38. bool intersect(Rectangle r2){
  39. if(u==-||r2.u==-)
  40. return ;
  41. if(intersect_help(r2))
  42. return ;
  43. if(r2.intersect_help(*this))
  44. return ;
  45. if(l<=r2.l&&r>=r2.r&&u<=r2.u&&d>=r2.d)
  46. return ;
  47. if(r2.l<=l&&r2.r>=r&&r2.u<=u&&r2.d>=d)
  48. return ;
  49. return ;
  50. }
  51.  
  52. int area(){
  53. return (r-l)*(u-d);
  54. }
  55.  
  56. void extend(Point p){
  57. if(u==-){
  58. l=r=p.x;
  59. u=d=p.y;
  60. return;
  61. }
  62. else{
  63. l=min(l,p.x);
  64. r=max(r,p.x);
  65. u=max(u,p.y);
  66. d=min(d,p.y);
  67. return;
  68. }
  69. }
  70.  
  71. void show(){
  72. printf(" u=%d d=%d l=%d r=%d\n",u,d,l,r);
  73. }
  74. };
  75.  
  76. int n,k;
  77. int ans=0x3f3f3f3f;
  78. void dfs4(int id,Rectangle r1,Rectangle r2,Rectangle r3,Rectangle r4){
  79. //r1.show(),r2.show(),r3.show(),r4.show();
  80. //printf("---------\n");
  81. int tans=r1.area()+r2.area()+r3.area()+r4.area();
  82. if(tans>=ans)
  83. return;
  84. if(id>n){
  85. ans=min(ans,tans);
  86. return;
  87. }
  88.  
  89. Point pi=p[id];
  90. if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi)||r4.inside(pi))
  91. dfs4(id+,r1,r2,r3,r4);
  92. else{
  93. Rectangle rr1=r1;
  94. rr1.extend(pi);
  95. if(rr1.intersect(r2)||rr1.intersect(r3)||rr1.intersect(r4))
  96. ;
  97. else{
  98. dfs4(id+,rr1,r2,r3,r4);
  99. }
  100.  
  101. Rectangle rr2=r2;
  102. rr2.extend(pi);
  103. if(rr2.intersect(r1)||rr2.intersect(r3)||rr2.intersect(r4))
  104. ;
  105. else{
  106. dfs4(id+,r1,rr2,r3,r4);
  107. }
  108.  
  109. Rectangle rr3=r3;
  110. rr3.extend(pi);
  111. if(rr3.intersect(r1)||rr3.intersect(r2)||rr3.intersect(r4))
  112. ;
  113. else{
  114. dfs4(id+,r1,r2,rr3,r4);
  115. }
  116.  
  117. Rectangle rr4=r4;
  118. rr4.extend(pi);
  119. if(rr4.intersect(r1)||rr4.intersect(r2)||rr4.intersect(r3))
  120. ;
  121. else{
  122. dfs4(id+,r1,r2,r3,rr4);
  123. }
  124. }
  125. }
  126.  
  127. void dfs3(int id,Rectangle r1,Rectangle r2,Rectangle r3){
  128. //r1.show(),r2.show(),r3.show();
  129. //printf("---------\n");
  130. int tans=r1.area()+r2.area()+r3.area();
  131. if(tans>=ans)
  132. return;
  133.  
  134. if(id>n){
  135. ans=min(ans,tans);
  136. return;
  137. }
  138.  
  139. Point pi=p[id];
  140. if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi))
  141. dfs3(id+,r1,r2,r3);
  142. else{
  143. Rectangle rr1=r1;
  144. rr1.extend(pi);
  145. if(rr1.intersect(r2)||rr1.intersect(r3))
  146. ;
  147. else{
  148. dfs3(id+,rr1,r2,r3);
  149. }
  150.  
  151. Rectangle rr2=r2;
  152. rr2.extend(pi);
  153. if(rr2.intersect(r1)||rr2.intersect(r3))
  154. ;
  155. else{
  156. dfs3(id+,r1,rr2,r3);
  157. }
  158.  
  159. Rectangle rr3=r3;
  160. rr3.extend(pi);
  161. if(rr3.intersect(r1)||rr3.intersect(r2))
  162. ;
  163. else{
  164. dfs3(id+,r1,r2,rr3);
  165. }
  166. }
  167. }
  168.  
  169. void dfs2(int id,Rectangle r1,Rectangle r2){
  170. int tans=r1.area()+r2.area();
  171. if(tans>=ans)
  172. return;
  173.  
  174. if(id>n){
  175. //r1.show(),r2.show();
  176. ans=min(ans,tans);
  177. //printf("tans=%d\n---------\n",tans);
  178. return;
  179. }
  180.  
  181. Point pi=p[id];
  182. if(r1.inside(pi)||r2.inside(pi))
  183. dfs2(id+,r1,r2);
  184. else{
  185. Rectangle rr1=r1;
  186. rr1.extend(pi);
  187. if(rr1.intersect(r2))
  188. ;
  189. else{
  190. dfs2(id+,rr1,r2);
  191. }
  192.  
  193. Rectangle rr2=r2;
  194. rr2.extend(pi);
  195. if(rr2.intersect(r1))
  196. ;
  197. else{
  198. dfs2(id+,r1,rr2);
  199. }
  200. }
  201. }
  202.  
  203. void dfs(int id,Rectangle r1){
  204. //r1.show();
  205. //printf("---------\n");
  206. int tans=r1.area();
  207. if(tans>=ans)
  208. return;
  209.  
  210. if(id>n){
  211. ans=min(ans,r1.area());
  212. return;
  213. }
  214.  
  215. Point pi=p[id];
  216. if(r1.inside(pi))
  217. dfs(id+,r1);
  218. else{
  219. Rectangle rr1=r1;
  220. rr1.extend(pi);
  221. dfs(id+,rr1);
  222. }
  223. }
  224.  
  225. int main(){
  226. scanf("%d%d",&n,&k);
  227. for(int i=;i<=n;i++){
  228. scanf("%d%d",&p[i].x,&p[i].y);
  229. }
  230. Rectangle r;
  231. switch(k){
  232. case :
  233. dfs(,r);
  234. break;
  235. case :
  236. dfs2(,r,r);
  237. break;
  238. case :
  239. dfs3(,r,r,r);
  240. break;
  241. case :
  242. dfs4(,r,r,r,r);
  243. }
  244. printf("%d\n",ans);
  245. }

洛谷 - 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. [转] 一句shell命令搞定代码行数统计

    今天面试时,突然被面试官问到怎样用shell命令搞定某个文件夹下java代码行数的统计. 想了一下,基本思路就是找到这个文件夹下面的所有java文件,然后每个文件统计一下代码,外层套个for循环,叠加 ...

  2. 递归获取JSON内容的key-value值

    方法主体: 使用时,请在类中先声明一个Map,參数形式例如以下: JSONObject jobj = new JSONObject(JSONContent); 首次请传递jobj.

  3. Android开发系列(二十一):Spinner的功能和使用方法以及实现列表选择框

    Spinner是一个列表选择框.相当于弹出一个菜单供用户进行选择. Spinner继承AdapterView Spinnet支持的XML的属性: android:entries:使用数组资源设置该下拉 ...

  4. IE8.0登录Oracle EBS后报Oracle error 1403错

    IE8.0登录Oracle EBS后报错,登录页面打开没有问题.只是输入username和password然后登录,遇到下面错误: <PRE>Oracle error 1403: java ...

  5. bash仅仅读的环境变量

    环境变量名 变量的用途 $0 程序的名字 $1~$9 命令參数1~9的值 $* 全部命令行參数的值 $@ 全部命令行參数的值.假设$@被""包含.即"$@",这 ...

  6. postgres源码目录结构

    1.第一级目录介绍 |_postgres |_aclocal.m4------------config用的文件的一部分 |_config----------------config文件目录 |_con ...

  7. LZMA C# SDK 结合 UPK 打包压缩 多目录 Unity3d实例

    上篇  LZMA C# SDK 子线程压缩与解压缩 Unity3d实例  讲了怎样使用 LZMA C# SDK 来对文件进行压缩与解压,当中提到 对于多目录能够先打包成 UPK 然后再 LZMA 压缩 ...

  8. appium部分api

    转自:http://www.aichengxu.com/view/41510 使用的语言是java,appium的版本是1.3.4,java-client的版本是java-client-2.1.0,建 ...

  9. node.js内存泄露问题记录

    先说一下.事情的来龙去脉. 公司开发一款游戏棋牌游戏,服务端的开发是IO密集型,开发的时候,考虑过使用python,java,node.js. 终于选择了node.js(node.js宣传的杀手功能. ...

  10. C++的string连接(a = a + b 与 a += b)

    大一学习C语言的时候,书上就写着a = a + b与 a += b等价,但是提倡用后者. 在CSDN上也看到一个关于a+=b和a=a+b的区别的帖子,大概内容如下:------------------ ...