题目链接:

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. PHP后门隐藏与维持技巧

    在一个成功的测试后,通常会想让特权保持的更久些.留后门的工作就显得至关重要,通常布设的后门包括但不限于数据库权限,WEB权限,系统用户权限等等.此文则对大众后门隐藏的一些思路做科普. AD: 0×00 ...

  2. MIT jos 6.828 Fall 2014 训练记录(lab 6)

    源代码参见我的github: https://github.com/YaoZengzeng/jos 在这个实验中将实现一个基于Intel 82540M(又称E1000)的网卡驱动.不过,一个网卡驱动还 ...

  3. codeforces 487C C. Prefix Product Sequence(构造+数论)

    题目链接: C. Prefix Product Sequence time limit per test 1 second memory limit per test 256 megabytes in ...

  4. 优化后的二次测试Miller_Rabin素性测试算法

    ll random(ll n) { return (ll)((double)rand()/RAND_MAX*n + 0.5); } ll pow_mod(ll a,ll p,ll n) { ) ; l ...

  5. Hamilton回路的判定与构造

    定理1:在一个具有n个顶点的无向连通图G中,如果任意两个顶点的度数之和大于n,则G具有Hamilton回路.此条件为充分条件 定理2:设图G = <V,E>,是Hamilton图,则对于v ...

  6. java 20 -3 递归之删除特定目录下的特定文件

    /* 需求:删除H:\demo目录下的带内容的文件 分析: A:封装该目录 B:获取该目录下所有的文件或文件夹的File数组 C:遍历该File数组,获取每一个File对象 D:判断所遍历的FIle对 ...

  7. [转] 国外程序员整理的 C++ 资源大全

    关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz 发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++标准库,包括了S ...

  8. iOS中使用RSA对数据进行加密解密

    RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名. 本文将讨论如何在iOS中使用RSA传输加密数据. 本文环境 mac os openssl-1.0. ...

  9. HYSBZ 2145 悄悄话

    2145: 悄悄话 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 271  Solved: 104[Submit][Status][Discuss] ...

  10. ZooKeeper学习第四期---构建ZooKeeper应用

    一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公共的部分.简单地说,ZooKeeper可以作为一个具有高可用性的配置存储器,允许分布式应用的参与者检索和 ...