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

我真傻,真的,我单知道这种题目可以用dfs剪枝过,没有想到还能构造分治,当我敲了一发dfs上去的时候,只看到一个42分的返回┭┮﹏┭┮

题意:构造用所给的四个图案拼凑一个缺制定位置的正方形,正方形的长度为2 ^ k (0 < k < 10)

一开始直接选择了dfs暴力填充,TLE却想不到有效的剪枝方法,一看题解这竟然是一道构造分治,原因除了愚蠢之外还有忽略了题目中正方形边长为2 ^ k这个条件

我们定义多出来的点为特殊点,我们可以用一个给定的图形把他构造为一个2 * 2的矩形,这时候如果要构造的是4 * 4的矩形,我们只需要在2 * 2的矩形下面拼接上一个图案,就多出了三个位置的特殊点,利用刚才的方法将他们补上,就变成了一个4 * 4的矩形,8 * 8同理。直接分治递归即可。

  1. #include <map>
  2. #include <set>
  3. #include <ctime>
  4. #include <cmath>
  5. #include <queue>
  6. #include <stack>
  7. #include <vector>
  8. #include <string>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <cstring>
  12. #include <sstream>
  13. #include <iostream>
  14. #include <algorithm>
  15. #include <functional>
  16. using namespace std;
  17. int read(){int x = ,f = ;char c = getchar();while (c<'' || c>''){if (c == '-') f = -;c = getchar();}
  18. while (c >= ''&&c <= ''){x = x * + c - '';c = getchar();}return x*f;}
  19. #define For(i, x, y) for(int i=x;i<=y;i++)
  20. #define _For(i, x, y) for(int i=x;i>=y;i--)
  21. #define Mem(f, x) memset(f,x,sizeof(f))
  22. #define Sca(x) scanf("%d", &x)
  23. #define Sca2(x,y) scanf("%d%d",&x,&y)
  24. #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
  25. #define Scl(x) scanf("%lld",&x);
  26. #define Pri(x) printf("%d\n", x)
  27. #define Prl(x) printf("%lld\n",x);
  28. #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
  29. #define LL long long
  30. #define ULL unsigned long long
  31. #define mp make_pair
  32. #define PII pair<int,int>
  33. #define PIL pair<int,long long>
  34. #define PLL pair<long long,long long>
  35. #define pb push_back
  36. #define fi first
  37. #define se second
  38. typedef vector<int> VI;
  39. const double eps = 1e-;
  40. const int maxn = ;
  41. const int INF = 0x3f3f3f3f;
  42. const int mod = 1e9 + ;
  43. int N,M,K;
  44. void dfs(int a,int b,int x,int y,int l){
  45. if(l == ) return;
  46. l >>= ;
  47. if(x - a + <= l && y - b + <= l){ //左上
  48. printf("%d %d 1\n",a + l,b + l);
  49. dfs(a,b,x,y,l);
  50. dfs(a,b + l,a + l - ,b + l,l);
  51. dfs(a + l,b,a + l,b + l - ,l);
  52. dfs(a + l,b + l,a + l,b + l,l);
  53. }
  54. if(x - a + <= l && y - b + > l){ // 右上
  55. printf("%d %d 2\n",a + l,b + l - );
  56. dfs(a,b,a + l - ,b + l - ,l);
  57. dfs(a,b + l,x,y,l);
  58. dfs(a + l,b,a + l,b + l - ,l);
  59. dfs(a + l,b + l,a + l,b + l,l);
  60. }
  61. if(x - a + > l && y - b + <= l){ //左下
  62. printf("%d %d 3\n",a + l - ,b + l);
  63. dfs(a,b,a + l - ,b + l - ,l);
  64. dfs(a,b + l,a + l - ,b + l,l);
  65. dfs(a + l,b,x,y,l);
  66. dfs(a + l,b + l,a + l,b + l,l);
  67. }
  68. if(x - a + > l && y - b + > l){ //右下
  69. printf("%d %d 4\n",a + l - ,b + l - );
  70. dfs(a,b,a + l - ,b + l - ,l);
  71. dfs(a,b + l,a + l - ,b + l,l);
  72. dfs(a + l,b,a + l,b + l - ,l);
  73. dfs(a + l,b + l,x,y,l);
  74. }
  75. }
  76. int main(){
  77. Sca(K);
  78. int x = read(),y = read();
  79. dfs(,,x,y,( << K));
  80. return ;
  81. }

洛谷P1228 分治的更多相关文章

  1. 浅谈分治 —— 洛谷P1228 地毯填补问题 题解

    如果想看原题网址的话请点击这里:地毯填补问题 原题: 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子 ...

  2. [洛谷P1228]地毯填补问题 题解(分治)

    Description 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的 ...

  3. 洛谷P1228 地毯填补问题

    P1228 地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站 ...

  4. 【文文殿下】【洛谷】分治NTT模板

    题解 可以计算每一项对后面几项的贡献,然后考虑后面每一项,发现这是一个卷积,直接暴力NTT就行了,发现它是一个有后效性的,我们选择使用CDQ分治. Tips:不能像通常CDQ分治一样直接 每次递归两边 ...

  5. 洛谷 P1228 【地毯填补问题】

    事实上感觉四个的形状分别是这样: spj报错: 1:c 越界 2:x,y 越界 3:mp[x][y] 已被占用 4:mp[x][y] 从未被使用 题解: 初看这个问题,似乎无从下手,于是我们可以先考虑 ...

  6. [洛谷P4721]分治FFT

    NTT入门,放个板子 // luogu-judger-enable-o2 #include <bits/stdc++.h> using namespace std; #define fr( ...

  7. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)

    LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...

  8. 洛谷SP22343 NORMA2 - Norma(分治,前缀和)

    洛谷题目传送门 这题推式子恶心..... 考虑分治,每次统计跨过\(mid\)的所有区间的答案和.\(i\)从\(mid-1\)到\(l\)枚举,统计以\(i\)为左端点的所有区间. 我们先维护好\( ...

  9. 洛谷P3810 陌上花开 CDQ分治(三维偏序)

    好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...

随机推荐

  1. c提取文件路径、文件名和后缀名

    /* MAKEPATH.C */ #include <stdlib.h> #include <stdio.h> void main( void ) { char path_bu ...

  2. 【SSL】OV、DV和EV证书的区别

    关于https证书 https协议需要到ca申请证书,一般免费证书很少,需要交费. http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议. http和https使用 ...

  3. BZOJ2809 dispatching 【可并堆】

    题目分析: yy一下就知道了,合并用可并堆少个log. 代码: #include<bits/stdc++.h> using namespace std; ; int n,m; int b[ ...

  4. Android环境搭建(大学授课课件)

    前面一直没有提过如何搭建Android开发环境,其实这些网上一大堆,随便一搜就是很多大神的详细介绍.本人过于懒惰,拿出大学授课课件供大家参考.非原创 位)   下载地址: sdk:http://pan ...

  5. 【BZOJ1578】【USACO2009Feb】股票市场 背包DP

    题目大意 告诉你\(n\)只股票在这\(m\)天内的价格,给你\(s\)元的初始资金,问你\(m\)天后你最多拥有多少钱. \(n\leq 50,m\leq 10,s\leq 200000,\)答案\ ...

  6. @ResponseBody注解

    作用 @ResponseBody注解表示该方法的返回结果直接写入HTTP response body中 原理 在使用此注解之后跳过视图处理器,将返回的对象通过适当的转换器转换为指定的格式之后,直接将数 ...

  7. CentOS7搭建配置SVN服务器

    安装subversionyum install subversionsubversion安装在/bin目录检查一下subversion是否安装成功svnserve --version 建立版本库sub ...

  8. Centos7安装OpenDCIM-19.01步骤

    Centos7安装OpenDCIM-19.01步骤 openDCIM是一款免费的开源解决方案,用于管理数据中心基础设施.它已经被几家企业组织所使用,由于开发人员的不懈努力,正在迅速完善. openDC ...

  9. 【agc013d】Piling Up(动态规划)

    [agc013d]Piling Up(动态规划) 题面 atcoder 洛谷 有\(n\)个球,颜色为黑白中的一种,初始时颜色任意. 进行\(m\)次操作,每次操作都是先拿出一个求,再放进黑白各一个, ...

  10. Nifi 老是死机

    1. nifi服务器配置 CPU:4核 内存:7G   2. 改动如下: nifi.provenance.repository.rollover.time=30 secs --> 36000 s ...