kotori和n皇后 (高校重现赛)

1 篇文章 0 订阅

链接:https://ac.nowcoder.com/acm/contest/940/F
来源:牛客网

题目描述
kotori最近在研究n皇后的问题。

所谓n皇后问题是这样的:一个n*n的地图,上面一共放n个皇后,保证任意两个皇后都不能互相攻击(每个皇后可以攻击同一行、同一列以及同一45度角斜线和135度角斜线上的所有其他皇后)。

kotori思考了很久都无法得出答案,整个人都变成琴梨了。她于是拿了一堆皇后在一个无穷大的棋盘上模拟,按照次序一共放了k个皇后。

但是,皇后的站位太复杂了,kotori甚至不知道是否存在两个皇后会互相攻击。于是她想问问聪明的你,在第i个皇后放置在棋盘上之后,是否存在两个皇后可以互相攻击?

输入描述:
第一行输入一个正整数k,代表总共放置的皇后的个数。(1<=k<=1e5)

接下来的k行,每行两个正整数xi和yi,代表每个皇后的坐标。(1<=xi,yi<=1e9)

之后输入一个正整数t,代表t次询问。(1<=t<=1e5)

接下来的t行,每行一个正整数i,代表询问第i个皇后放置后,是否存在互相攻击的情况。(1<=i<=k)

保证不存在两个皇后放置的位置相同。
输出描述:
共t行。每行对应当前的询问是否存在两个皇后可以互相攻击,若是则输出“Yes”,否则输出“No”
示例1
输入
复制
5
1 2
2 5
3 1
6 7
4 8
2
2
4
输出
复制
No
Yes
说明
第四个皇后放置后,第四个和第一个皇后可以互相攻击。
思路:原题意应该是一个超级水题,但是它的条件判断轻描淡写,加上最后的提示总让人以为要求所有冲突和不冲突的棋子,但是在回过来读一下他的核心意思:摆放i个之后是否存在冲突的情况,也就是说找出第一个冲突的棋子就好了,后面的当然就理所应当的存在呀。
补:斜边的判重情况 设两点 x,y ; x1,y1 有 abs(x-x1) = abs(y-y1) ,开绝对值之和可得两个点x , y之和与之差分别相等,那么我们在输入得时候挨个用桶装这些可能得值就可以判定了。

#include <bits/stdc++.h>
   using namespace std;
    typedef long long ll;

  int main()
  {
      unordered_map<int,int> X,Y,Z;
    int n;
    int flag = 100001;
     scanf("%d",&n);
       for(int i = 1 ; i <= n ; ++ i)
          {
             int x , y;
               scanf("%d%d",&x,&y);
                  X[x] ++ , Y[y]++ , Z[x - y]++ , Z[x + y] ++;
                     if( X[x] > 1 || Y[y] > 1 || Z[x+y] > 1 || Z[x-y] > 1)
                         flag = flag == 100001 ? i : flag;
          }
      int k;
       scanf("%d",&k);
      for(int j = 0 ; j < k ; ++ j)
      {
        int i;
          scanf("%d",&i);
            if( i < flag) puts("No");
              else puts("Yes");
      }

  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值