题目链接

https://codeforces.com/contest/698/problem/D

题解

玄妙好题啊
对于每个元素\(j\)判断\(j\)是否可被射中。假设我们要用第\(i\)个弓箭射中第\(j\)个目标,那么在射中之前有若干个目标是我们需要先射中的。但我们并不知道应该用哪些目标射中。
于是我们可以枚举一个\(1\)至\(m\)的全排列\(P_k\), 然后进行BFS. 初始队列中只有\(j\),每次取出队首元素(设队首在队列中的位置为\(k\)),然后用\(P_k\)去射队首元素,然后加入队列。若队列中元素个数超过\(m\), 则无解(以这个顺序射中\(j\)是不可能的)。
时间复杂度\(O(k!kn)\)

代码

#include<bits/stdc++.h>
#define llong long long
#define mkpr make_pair
#define riterator reverse_iterator
using namespace std;inline int read()
{int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f;
}const int N = 1000;
const int M = 7;
struct Point
{int x,y;
} a[M+2],b[N+3];
vector<int> l[M+2][N+3];
int permu[M+2];
int que[N+3]; bool vis[N+3];
int n,m;int main()
{scanf("%d%d",&m,&n);for(int i=1; i<=m; i++) scanf("%d%d",&a[i].x,&a[i].y);for(int i=1; i<=n; i++) scanf("%d%d",&b[i].x,&b[i].y);for(int i=1; i<=m; i++){for(int j=1; j<=n; j++){for(int k=1; k<=n; k++) if(k!=j){if(1ll*(b[j].x-a[i].x)*(b[k].y-a[i].y)==1ll*(b[j].y-a[i].y)*(b[k].x-a[i].x) && (1ll*(a[i].x-b[k].x)*(b[j].x-b[k].x)<0 || (a[i].x==b[k].x&&1ll*(a[i].y-b[k].y)*(b[j].y-b[k].y)<0))){l[i][j].push_back(k);}}}}int fans = 0;for(int j=1; j<=n; j++){for(int i=1; i<=m; i++) permu[i] = i;bool ans = false;do{for(int i=1; i<=n; i++) vis[i] = false;bool cur = true;int hd = 1,tl = 1; que[tl] = j; vis[j] = true;while(hd<=tl){int u = que[hd];for(int i=0; i<l[permu[hd]][u].size(); i++){if(vis[l[permu[hd]][u][i]]) continue;que[++tl] = l[permu[hd]][u][i]; vis[l[permu[hd]][u][i]] = true;if(tl>m) {cur = false; break;}}if(!cur) {break;}hd++;}if(cur) {ans = true; break;}} while(next_permutation(permu+1,permu+m+1));if(ans) {fans++;}}printf("%d\n",fans);return 0;
}

Codeforces 698D Limak and Shooting Points (搜索)相关推荐

  1. 续 Codeforces 596 C Wilbur and Points

    传送门: http://codeforces.com/contest/596/problem/C 前一篇是数据结构的解法,这回换一种解法,其实是屌丝解法,方法和上面一样,只是用 vector加上局部排 ...

  2. CodeForces 540C--自带标记的四方向搜索

    题意: 给一个 n 行,m 列的字符矩阵,*表示完整的冰块,X表示断裂的冰块,*踩一下变成X,X踩一下就断裂,之后给出两个确定的点,在 保证冰块不发生断裂的情况下,问能否从一个点走到另一个点,并将到达 ...

  3. Codeforces Beta Round #19 D. Points

    题意: 给定一个平面, add(x,y), 增加一个点(x,y),保证以前不存在; delete(x,y), 删除一个点(x,y),保证存在你; query(x,y), 询问严格大于(x,y)的点,输 ...

  4. (CodeForces) D. Kilani and the Game (搜索)

    视频讲解戳这里 传送门 题目大意:一个n*m的图,有空格子'.',也有障碍物'#',也有各个玩家的城堡,编号对应着玩家的编号1,2,3.....;每个玩家轮流开始,有他城堡的地方就可以向上下左右扩散, ...

  5. 【集训队作业】IOI 2020 集训队作业 试题泛做 13

    Codeforces 679E Bear and Bad Powers of 42 不难发现数列中的元素不可能达到很大,我们只需要考虑 424242 的前若干个幂. 考虑没有赋值操作的做法,则可用线段 ...

  6. codeforces泛做

    codeforces div1的题目,一般是做B.C.D 有的A题觉得有价值也会做,死活不会的就跳了-- 364 B: Connecting Universities Problem: 一颗无根树上给 ...

  7. Codeforces 769D k-Интересные пары чисел

    题目链接:http://codeforces.com/contest/769/problem/D 搜索题 考虑这些数的值域较小,直接${O(2^{k})}$次方枚举每个数字二进制位上是否改变,剪枝一下 ...

  8. python大数据运维工程师待遇_大数据运维工程师具体是做什么的?

    大数据运维的工作职责 一.集群管理 大数据需要分布式系统,也就是集群:Hadoop,Hbase,Spark,Kafka,Redis等大数据生态圈组建. 二.故障处理 1>.商用硬件使用故障是常态 ...

  9. oracle怎么查日记账,Oracle EBS 导入日记账报错

    洛谷P3379 [模板]最近公共祖先(LCA) P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 为 ...

最新文章

  1. Azure:不能把同一个certificate同时用于Azure Management和RDP
  2. php 跳转网页 变量,php变量与JS变量实现不通过跳转直接交互的方法
  3. [云炬创业基础笔记]第十章企业的利润计划测试3
  4. 4.1.2 私有成员与公有成员
  5. php mongo 游标超时,游标在MongoDb游标上超时错误
  6. jQuery子页面获取父页面元素
  7. 天天在做图表,其实你根本不懂数据可视化
  8. PHP设计模式——模板模式
  9. 路由选择使用指南之二Padavan
  10. 黑马程序员最新版JavaWeb综合案例(前后端完整版)
  11. 使用uib-tab时,获取页面输入框内容
  12. mysql 创建同义词_Oracle synonym 同义词创建与删除
  13. 三线制PT100测正温(篇一)
  14. 云端新增长,混合云融合发展新路径 | 云端会客厅第28期精彩回顾
  15. 我爱你用计算机怎么表示,特殊密码表示我爱你
  16. 异步9月新书重磅出炉,送出一本你爱的
  17. WooCommerce Bookings 电子商务预订系统评测 – 创建WordPress预订系统有多好?
  18. SATA 硬盘/SSD温度读取
  19. “电子版H5结婚请柬”制作全攻略
  20. 自学html手机网页设计,HTML_XHTML入门学习教程:简单网页制作,用一分钟制作自己的第一个网 - phpStudy...

热门文章

  1. [2dPIC调试笔记]输入参数归一化1014(1)
  2. centos7 php多版本切换_centos7安装python3
  3. Qt修炼手册3_VS建立的Qt工程(或项目)生成pro文件
  4. jQuery中eq和get的区别
  5. u-boot编译过程分析
  6. 【CyberSecurityLearning 64】SSRF
  7. 【CyberSecurityLearning 42】日志记录规则
  8. json的格式和简单例子
  9. nginx中js修改不生效的问题
  10. C语言再学习 -- 位操作