Codeforces Round #379 (Div. 2) D. Anton and Chess 模拟
题目链接:
http://codeforces.com/contest/734/problem/D
D. Anton and Chess
time limit per test4 secondsmemory 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 模拟的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- Codeforces Round #379 (Div. 2) B. Anton and Digits 水题
B. Anton and Digits 题目连接: http://codeforces.com/contest/734/problem/B Description Recently Anton fou ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- hdu1042 N!
/* N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Subm ...
- Fisker大师用ZBrush制作兽人萨尔全过程
十二年前,暴雪推出第一款网络游戏<魔兽世界>,以迅雷不及掩耳盗铃之势风靡全球:十二年后,魔兽终于改编成大电影,同样掀起了一场巨大的风暴, 接二连三打破了多项票房纪录.纵观游戏史,很难找出一 ...
- hdu 5802 Windows 10 贪贪贪
传送门:hdu 5802 Windows 10 题意:把p变成q:升的时候每次只能升1,降的时候如果前一次是升或者停,那么下一次降从1开始,否则为前一次的两倍 官方题解: 您可能是正版Windows ...
- [ZZ]Sign Up for the First-Ever Appium Roadshow on August 20th in New York City
http://sauceio.com/index.php/2014/07/appium-roadshow-nyc/?utm_source=feedly&utm_reader=feedly&am ...
- Codeforces Round #267 Div.2 D Fedor and Essay -- 强连通 DFS
题意:给一篇文章,再给一些单词替换关系a b,表示单词a可被b替换,可多次替换,问最后把这篇文章替换后(或不替换)能达到的最小的'r'的个数是多少,如果'r'的个数相等,那么尽量是文章最短. 解法:易 ...
- java 为啥变量名前要加个m?
用m_开头表示类的成员变量,member的意思如果是全局变量,则由g_开头还有常量c_开头 静态变量s_开头
- Android开发配置,消除SDK更新时的“https://dl-ssl.google.com refused”异常
消除SDK更新时的“https://dl-ssl.google.com refused”错误 消除SDK更新时,有可能会出现这样的错误:Download interrupted: hostname i ...
- NSURLSession学习笔记
NSURLSession学习笔记(一)简介 一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁 ...
- Netty5-应答服务器
需求: 服务端:接收客户端请求,返回当前系统时间 客户端:发起时间请求 服务端 package org.zln.netty.five.timer; import io.netty.bootstrap. ...
- SqlDevlepor注册表监听器设置
1.打开plsqldev. 2. 键入环境变量 NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16GBK 3.下载sqldevclient. http://pa ...