题目链接:

http://codeforces.com/contest/734/problem/D

D. Anton and Chess

time limit per test4 seconds
memory limit per test256 megabytes
#### 问题描述
> Anton likes to play chess. Also, he likes to do programming. That is why he decided to write the program that plays chess. However, he finds the game on 8 to 8 board to too simple, he uses an infinite one instead.
>
> The first task he faced is to check whether the king is in check. Anton doesn't know how to implement this so he asks you to help.
>
> Consider that an infinite chess board contains one white king and the number of black pieces. There are only rooks, bishops and queens, as the other pieces are not supported yet. The white king is said to be in check if at least one black piece can reach the cell with the king in one move.
>
> Help Anton and write the program that for the given position determines whether the white king is in check.
>
> Remainder, on how do chess pieces move:
>
> Bishop moves any number of cells diagonally, but it can't "leap" over the occupied cells.
> Rook moves any number of cells horizontally or vertically, but it also can't "leap" over the occupied cells.
> Queen is able to move any number of cells horizontally, vertically or diagonally, but it also can't "leap".
#### 输入
> The first line of the input contains a single integer n (1 ≤ n ≤ 500 000) — the number of black pieces.
>
> The second line contains two integers x0 and y0 ( - 109 ≤ x0, y0 ≤ 109) — coordinates of the white king.
>
> Then follow n lines, each of them contains a character and two integers xi and yi ( - 109 ≤ xi, yi ≤ 109) — type of the i-th piece and its position. Character 'B' stands for the bishop, 'R' for the rook and 'Q' for the queen. It's guaranteed that no two pieces occupy the same position.
#### 输出
> The only line of the output should contains "YES" (without quotes) if the white king is in check and "NO" (without quotes) otherwise.
####样例输入
> 2
> 4 2
> R 1 1
> B 1 5

样例输出

YES

题意

给你一个地图很大的国际象棋棋盘,其中白的只有王,黑的有若干个王后(既能走直线,又能走对角),象(走对角线),车(直着走),问你能不能将死白棋的王,(注意,黑棋要攻击到王,王要在该黑棋的攻击范围内,且中间不能跳过其他棋子)

题解

因为中间有其他的点而攻击不到王的只有两种情况:

1、车和王之间夹了一个象。

2、象或者王后和王之间夹了一个车。

所以我们只要分别维护离王最近的八个方向的车、象就可以了。然后枚举每一个黑子,判断中间是否有被阻挡。

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf typedef __int64 LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int maxn=500000+10; int n;
int x_0,y_0; PII Rrr[8],Brr[8];
int vR[8],vB[8];
PII in[maxn];
char inc[maxn]; LL dis(PII pt){
return (LL)abs(x_0-pt.X)+(LL)abs(y_0-pt.Y);
} int Dir(PII pt){
int res=-1;
if(pt.X==x_0){
if(pt.Y>y_0) res=3;
else res=7;
}
else if(pt.Y==y_0){
if(pt.X>x_0) res=1;
else res=5;
}
else if(pt.X+pt.Y==x_0+y_0){
if(pt.X<x_0&&pt.Y>y_0) res=4;
else res=0;
}else if(pt.X-x_0==pt.Y-y_0){
if(pt.X<x_0&&pt.Y<y_0) res=6;
else res=2;
}
return res;
} int main() {
clr(vR,0);
clr(vB,0);
scf("%d",&n);
scf("%d%d",&x_0,&y_0);
rep(i,0,n){
char type[11];
scf("%s%d%d",type,&in[i].X,&in[i].Y);
inc[i]=type[0];
int dir=Dir(in[i]);
if(dir==-1) continue;
if(type[0]=='R'){
if(dir%2==0){
if(vR[dir]==false){
vR[dir]=true;
Rrr[dir]=in[i];
}else{
if(dis(in[i])<dis(Rrr[dir])){
Rrr[dir]=in[i];
}
}
}
}else if(type[0]=='B'){
if(dir%2){
if(vB[dir]==false){
vB[dir]=true;
Brr[dir]=in[i];
}else{
if(dis(in[i])<dis(Brr[dir])){
Brr[dir]=in[i];
}
}
}
}
}
bool su=false;
rep(i,0,n){
int dir=Dir(in[i]);
if(dir==-1) continue;
if(inc[i]=='B'||inc[i]=='Q'){
if(dir%2==0){
if(vR[dir]==false||vR[dir]&&dis(in[i])<dis(Rrr[dir])){
su=true;
}
}
}
if(inc[i]=='R'||inc[i]=='Q'){
if(dir%2==1){
if(vB[dir]==false||vB[dir]&&dis(in[i])<dis(Brr[dir])){
su=true;
}
}
}
if(su) break;
}
if(su) prf("YES\n");
else prf("NO\n");
return 0;
} //end-----------------------------------------------------------------------

写搓了,其实只要维护八个方向离王最近的点,然后看这些点有没有能攻击到王的就可以了。。

Codeforces Round #379 (Div. 2) D. Anton and Chess 模拟的更多相关文章

  1. Codeforces Round #379 (Div. 2) D. Anton and Chess 水题

    D. Anton and Chess 题目连接: http://codeforces.com/contest/734/problem/D Description Anton likes to play ...

  2. Codeforces Round #379 (Div. 2) D. Anton and Chess —— 基础题

    题目链接:http://codeforces.com/contest/734/problem/D D. Anton and Chess time limit per test 4 seconds me ...

  3. Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 直径

    E. Anton and Tree 题目连接: http://codeforces.com/contest/734/problem/E Description Anton is growing a t ...

  4. Codeforces Round #379 (Div. 2) C. Anton and Making Potions 枚举+二分

    C. Anton and Making Potions 题目连接: http://codeforces.com/contest/734/problem/C Description Anton is p ...

  5. Codeforces Round #379 (Div. 2) B. Anton and Digits 水题

    B. Anton and Digits 题目连接: http://codeforces.com/contest/734/problem/B Description Recently Anton fou ...

  6. Codeforces Round #379 (Div. 2) A. Anton and Danik 水题

    A. Anton and Danik 题目连接: http://codeforces.com/contest/734/problem/A Description Anton likes to play ...

  7. Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路

    题目链接:http://codeforces.com/contest/734/problem/E E. Anton and Tree time limit per test 3 seconds mem ...

  8. Codeforces Round #379 (Div. 2) C. Anton and Making Potions —— 二分

    题目链接:http://codeforces.com/contest/734/problem/C C. Anton and Making Potions time limit per test 4 s ...

  9. Codeforces Round #379 (Div. 2) E. Anton and Tree 树的直径

    E. Anton and Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard i ...

随机推荐

  1. USACO section1.2 Miking cows

    /* ID: vincent63 LANG: C TASK: milk2 */ #include <stdio.h> #include<stdlib.h> #include&l ...

  2. SDRAM总结

    使用的流程 W9825G6JH winbond sdram 4M words X 4banks X 16bits=. Accesses to the SDRAM are burst oriented. ...

  3. uva 1606 amphiphilic carbon molecules【把缩写写出来,有惊喜】(滑动窗口)——yhx

    Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new classof ...

  4. selenium如何操作cookies实现免登录

    执行接口测试或者某些自动化测试时,为了避免每次访问接口都需要登录操作,可以用访问接口时,把cookies信息传过去. 思路是先登录一次页面,获取到cookies信息,把cookies信息保存到本地文件 ...

  5. 【Android UI设计与开发】5.底部菜单栏(二)使用Fragment实现底部菜单栏

    既然 Fragment 取代了TabActivity,当然 TabActivity 的能实现的菜单栏,Fragment 当然也能实现.主要其实就是通过菜单栏的点击事件切换 Fragment 的显示和隐 ...

  6. 孙鑫视频学习:“operator +=” 不明确的问题解决方法

    在基于单文档应用程序的MFC程序中,在OnChar函数中使用m_strLine+=nChar时,出现了error C2593:“operator +=”不明确的错误,经百度,找到如下解决方法,亲测可用 ...

  7. putty 访问 vmware中ubuntu 方法

     putty访问虚拟机   从宿主机中用putty连接虚拟机中的Ubuntu. putty默认使用ssh方式连接,这需要在Ubuntu Server中安装ssh服务.使用命令sudo apt-get ...

  8. C# Reflection BindingFlags

    定义包含在搜索中的成员 下列 BindingFlags 筛选标志可用于定义包含在搜索中的成员: 为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.St ...

  9. Unity 协程与线程

    协程是不同步的 协程 不是 线程,协同程序是 不同步 的 一个线程在程序中和其他线程是异步运行的,在多处理器机器中一个线程可以同时与所有其他线程的实时运行其代码,这使得线程编程能够解决很复杂的事情,因 ...

  10. (转) C#多线程赛跑实例

    专于:http://blog.csdn.net/lidatgb/article/details/8363035 结合上篇<多线程的基础>,这次我们写一个多线程的赛跑实例,内容很简单:超人和 ...