题意:$n*m$棋盘放置k个皇后,问几个格子不被攻击 1≤n,m≤20000,1≤k≤500

开set判重暴力$O(n*k)$然而,setMLE了QAQ

正解确实是$O(n*k)$的

以hang[i]记录此行是否被占用

用c[i]动态维护没被占用的行有几个安全的,(枚举皇后打标记)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cctype>
  5. #include<algorithm>
  6. #include<set>
  7. using namespace std;
  8. #define olinr return
  9. #define _ 0
  10. #define love_nmr 0
  11. #define DB double
  12. int x[];
  13. int y[];
  14. bool hang[];
  15. bool c[];
  16. inline int read()
  17. {
  18. int x=,f=;
  19. char ch=getchar();
  20. while(!isdigit(ch))
  21. {
  22. if(ch=='-')
  23. f=-f;
  24. ch=getchar();
  25. }
  26. while(isdigit(ch))
  27. {
  28. x=(x<<)+(x<<)+(ch^);
  29. ch=getchar();
  30. }
  31. return x*f;
  32. }
  33. inline void put(int x)
  34. {
  35. if(x<)
  36. {
  37. x=-x;
  38. putchar('-');
  39. }
  40. if(x>)
  41. put(x/);
  42. putchar(x%+'');
  43. }
  44. int n;
  45. int m;
  46. int k;
  47. int ans;
  48. int main()
  49. {
  50. n=read();
  51. m=read();
  52. k=read();
  53. for(int i=;i<=k;i++)
  54. {
  55. x[i]=read();
  56. y[i]=read();
  57. hang[x[i]]=true;
  58. }
  59. for(int i=;i<=n;i++)
  60. {
  61. if(!hang[i])
  62. {
  63. memset(c,,sizeof c);
  64. int sum=m;
  65. for(int j=;j<=k;j++)
  66. {
  67. if(!c[y[j]]) //枚举所占列,sum--
  68. {
  69. c[y[j]]=true;
  70. sum--;
  71. }
  72. if(y[j]+x[j]-i>=&&y[j]+x[j]-i<=m&&!c[y[j]+x[j]-i]) //自己推一下,神奇的事情发生了! 这居然是皇后左下到右上对角线与当前行交点的y!!!!!!!
  73. {
  74. c[y[j]+x[j]-i]=true;
  75. sum--;
  76. }
  77. if(y[j]-x[j]+i>=&&y[j]-x[j]+i<=m&&!c[y[j]-x[j]+i]) //这里是从右下到左上的交点
  78. {
  79. c[y[j]-x[j]+i]=true;
  80. sum--;
  81. }
  82. }
  83. ans+=sum; //统计安全~~~~~的
  84. }
  85. }
  86. put(ans);
  87. olinr ~~(^_^)+love_nmr;
  88. }

P2105 K皇后的更多相关文章

  1. 洛谷 P2105 K皇后

    P2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的那一行,那 ...

  2. 洛谷P2105 K皇后

    To 洛谷.2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的 ...

  3. 洛谷2105 k皇后

    P2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的那一行,那 ...

  4. K皇后问题递归解法

      #include<iostream> #include<cmath> #include<ctime> using namespace std; bool che ...

  5. k皇后

    http://www.cnblogs.com/drizzlecrj/archive/2007/10/04/913703.html

  6. N皇后求解。万万没想到,只用一个一维数组就搞定了。还体现了回溯。

    一.啥是N皇后?先从四皇后入手 给定一个4x4的棋盘,要在棋盘上放置4个皇后.他们的位置有这样的要求,每一列,每一行,每一对角线都能有一个皇后. 你可能会对这个对角线有疑惑,其实就是每一个小正方形的对 ...

  7. 【Codeforces】Gym 101156G Non-Attacking Queens 打表

    题意 求$n\times n$的棋盘上放$3$个皇后使得互相不攻击的方案数 拓展是$m\times n$棋盘上放$k$皇后,暴力打表找到了公式 OEIS 代码 import java.math.Big ...

  8. 算法设计与分析——n后问题(回溯法+位运算)

    一.问题描述 在n×n格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 二.算法设计 解n后问题的回溯算法描述如下: #include ...

  9. E. Yet Another Task with Queens(分类思想)

    \(\color{Red}{描述}\) \(在n*n的棋盘上有m个K皇后,每个皇后可能被来自8个方向的其他皇后攻击\) \(每个皇后只可能被(0-8)只皇后攻击,分别求出被(0-8)只皇后攻击的皇后数 ...

随机推荐

  1. git学习 删除远程分支

    2种方法删除远端分支: git branch -r -d origin/branch-name    // -r:  远端:    -d:删除 git push origin :branch-name ...

  2. 生产者与消费者---demo2---boke

    假设有这样一种情况,有一个桌子,桌子上面有一个盘子,盘子里只能放一颗鸡蛋,A专门往盘子里放鸡蛋,如果盘子里有鸡蛋,则一直等到盘子里没鸡蛋,B专门从盘子里拿鸡蛋,如果盘子里没鸡蛋,则等待直到盘子里有鸡蛋 ...

  3. 深入理解Java虚拟机—JVM内存结构

    1.概述 jvm内存分为线程共享区和线程独占区,线程独占区主要包括虚拟机栈.本地方法栈.程序计数器:线程共享区包括堆和方法区 2.线程独占区 虚拟机栈 虚拟机栈描述的是java方法执行的动态内存模型, ...

  4. AJAX——XMLHttpRequest对象的使用

    AJAX是web2.0即动态网页的基础,而XMLHttpRequest对象又是AJAX的核心.XMLHttpRequest对象负责将用户信息以异步通信地发送到服务器端,并接收服务器响应信息和数据 一. ...

  5. Tiny4412 Linux 内核配置流程

    1.配置交叉编译器 默认情况下,内核构建的是与宿主机相同的体系架构镜像.如果要交叉编译,需要设置两个变量ARCH和CORSS_COMPILE. ①ARCH:指明目标体系架构,如x86.arm.mips ...

  6. WebRTC的拥塞控制技术<转>

    转载地址:http://www.jianshu.com/p/9061b6d0a901 1. 概述 对于共享网络资源的各类应用来说,拥塞控制技术的使用有利于提高带宽利用率,同时也使得终端用户在使用网络时 ...

  7. DAY16-Django之model

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  8. hadoop再次集群搭建(4)-Cloudera Manager Installation

       决定选择 Cloudera Manager 进行安装,阅读官方文档,掌握大概脉络.         Cloudera Manager在集群已经实现ssh免秘钥登录,能够访问网络资源和本地资源的情 ...

  9. android task stack

    http://www.android100.net/html/201402/22/5690.html

  10. p2657 windy数

    传送门 分析 首先这是一个询问一段区间内的个数的问题,所以我们可以用差分的思想用sum(R)-sum(L-1).然后我们考虑如何求出sum(n),我们用dp[i][j][k][t]表示考虑到第i位,最 ...