【AtCoder】Beginner Contest 377-C.Avoid Knight Attack

news/2024/11/12 22:29:37/

Avoid Knight Attack

题目链接

Problem Statement

There is a grid of N 2 N^2 N2 squares with N N N rows and N N N columns. Let ( i , j ) (i,j) (i,j) denote the square at the i i i-th row from the top ( 1 ≤ i ≤ N ) (1\leq i\leq N) (1iN) and j j j-th column from the left ( 1 ≤ j ≤ N ) (1\leq j\leq N) (1jN).

Each square is either empty or has a piece placed on it. There are M M M pieces placed on the grid, and the k k k-th ( 1 ≤ k ≤ M ) (1\leq k\leq M) (1kM) piece is placed on square ( a k , b k ) (a_k,b_k) (ak,bk).

You want to place your piece on an empty square in such a way that it cannot be captured by any of the existing pieces.

A piece placed on square ( i , j ) (i,j) (i,j) can capture pieces that satisfy any of the following conditions:

  • Placed on square ( i + 2 , j + 1 ) (i+2,j+1) (i+2,j+1)
  • Placed on square ( i + 1 , j + 2 ) (i+1,j+2) (i+1,j+2)
  • Placed on square ( i − 1 , j + 2 ) (i-1,j+2) (i1,j+2)
  • Placed on square ( i − 2 , j + 1 ) (i-2,j+1) (i2,j+1)
  • Placed on square ( i − 2 , j − 1 ) (i-2,j-1) (i2,j1)
  • Placed on square ( i − 1 , j − 2 ) (i-1,j-2) (i1,j2)
  • Placed on square ( i + 1 , j − 2 ) (i+1,j-2) (i+1,j2)
  • Placed on square ( i + 2 , j − 1 ) (i+2,j-1) (i+2,j1)

Here, conditions involving non-existent squares are considered to never be satisfied.

For example, a piece placed on square ( 4 , 4 ) (4,4) (4,4) can capture pieces placed on the squares shown in blue in the following figure:

How many squares can you place your piece on?

中文题意

问题陈述

有一个由 N 2 N^2 N2 个正方形组成的网格,包含 N N N 行和 N N N 列。设 ( i , j ) (i,j) (i,j) 表示从上到下第 i i i ( 1 ≤ i ≤ N ) (1\leq i\leq N) (1iN) 和从左到下第 j j j ( 1 ≤ j ≤ N ) (1\leq j\leq N) (1jN) 处的正方形。

每个方块要么是空的,要么上面放着一个棋子。网格上有 M M M 个棋子, k k k ( 1 ≤ k ≤ M ) (1\leq k\leq M) (1kM) 个棋子放置在 KaTeX parse error: Expected 'EOF', got '&' at position 4: (a &̲#95; k,b _ … 方格上。

你想把你的棋子放在一个空的正方形上,这样它就不会被任何现有的棋子所捕获。

放置在 ( i , j ) (i,j) (i,j) 方块上的棋子可以捕获满足以下任何条件的棋子:

  • 放置在 ( i + 2 , j + 1 ) (i+2,j+1) (i+2,j+1) 方块上
  • 放置在正方形 ( i + 1 , j + 2 ) (i+1,j+2) (i+1,j+2)
  • 放置在 ( i − 1 , j + 2 ) (i-1,j+2) (i1,j+2) 方框上
  • 放置在 ( i − 2 , j + 1 ) (i-2,j+1) (i2,j+1) 方块上
  • 放置在 ( i − 2 , j − 1 ) (i-2,j-1) (i2,j1) 方块上
  • 放置在正方形 ( i − 1 , j − 2 ) (i-1,j-2) (i1,j2)
  • 放置在 ( i + 1 , j − 2 ) (i+1,j-2) (i+1,j2) 方块上
  • 放置在正方形 ( i + 2 , j − 1 ) (i+2,j-1) (i+2,j1)

在这里,涉及不存在的正方形的条件被认为永远不满足。

例如,放置在方格 ( 4 , 4 ) (4,4) (4,4) 上的棋子可以捕获放置在下图中蓝色方格上的棋子:

你能把棋子放在几个方格上?

Constraints

  • 1 ≤ N ≤ 1 0 9 1\leq N\leq10^9 1N109
  • 1 ≤ M ≤ 2 × 1 0 5 1\leq M\leq2\times10^5 1M2×105
  • 1 ≤ a k ≤ N , 1 ≤ b k ≤ N ( 1 ≤ k ≤ M ) 1\leq a_k\leq N,1\leq b_k\leq N\ (1\leq k\leq M) 1akN,1bkN (1kM)
  • ( a k , b k ) ≠ ( a l , b l ) ( 1 ≤ k < l ≤ M ) (a_k,b_k)\neq(a_l,b_l)\ (1\leq k\lt l\leq M) (ak,bk)=(al,bl) (1k<lM)
  • All input values are integers.

Input

The input is given from Standard Input in the following format:

N N N M M M

a 1 a_1 a1 b 1 b_1 b1

a 2 a_2 a2 b 2 b_2 b2

⋮ \vdots

a M a_M aM b M b_M bM

Output

Print the number of empty squares where you can place your piece without it being captured by any existing pieces.

Sample Input 1

8 6
1 4
2 1
3 8
4 5
5 2
8 3

Sample Output 1

38

The existing pieces can capture pieces placed on the squares shown in blue in the following figure:

Therefore, you can place your piece on the remaining 38 38 38 squares.

Sample Input 2

1000000000 1
1 1

Sample Output 2

999999999999999997

Out of 1 0 18 10^{18} 1018 squares, only 3 3 3 squares cannot be used: squares ( 1 , 1 ) (1,1) (1,1), ( 2 , 3 ) (2,3) (2,3), and ( 3 , 2 ) (3,2) (3,2).

Note that the answer may be 2 32 2^{32} 232 or greater.

Sample Input 3

20 10
1 4
7 11
7 15
8 10
11 6
12 5
13 1
15 2
20 10
20 15

Sample Output 3

338

解法

这道题目大意,棋子的攻击位置是一个“日”字型的的走法,如果当前位置上有元素,则“日”字型的位置上都不能放元素。现在要我们统计还有多少个位置可以放元素。

使用八连通日字型分量的形式计算哪个位置不能放棋子,并且使用一个集合将所有不能放棋子的位置存起来。最后使用总的位置个数减去集合的长度就可以判断出有多少个位置还可以放棋子。

因为这道题可用的方格数量高达 1 0 18 10^{18} 1018 个,直接使用二维数组来存的话有可能会爆掉,所以我们使用一个集合来存储已经被占用的下标即可(以数对的形式存储)。

typedef long long LL;
LL n, m;
set<PII> s;
typedef pair<int, int> PII;
int dxr[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dyr[8] = {1, 2, 2, 1, -1, -2, -2, -1};void solved() {/* your code */cin >> n >> m;while(m --) {int x, y;cin >> x >> y;s.insert({x ,y});for (int i = 0; i < 8; i ++) {// 依次遍历八个方向int a = x + dxr[i], b = y + dyr[i];// 如果在范围内,就把下一个位置加入集合if(a > 0 && a <= n && b > 0 && b <= n) {s.insert({a, b});}}}// 答案等于棋盘大小 - 集合的长度cout << n * n - s.size() << endl;
}

总结

这道题于昨天的题相比数据明显要大,不能使用数组标记法去做,合理的使用唯一标记法,是我们做题的便捷手段。

这道题着重练习日字型八连通分量,题目不难,但思路重要。


http://www.ppmy.cn/news/1545588.html

相关文章

数据分析-44-时间序列预测之深度学习方法TCN

文章目录 1 TCN简介1.1 网络示意图1.2 TCN优点2 模拟应用2.1 模拟数据2.2 预处理创建滞后特征2.3 划分训练集和测试集2.4 创建TCN模型2.5 模型训练2.6 模型预测3 自定义my_TCN模型3.1 my_TCN()函数3.2 训练模型3.3 模型预测3.4 改进4 参考附录1 TCN简介 时间卷积网络(TCN)是…

Docker + Python

文章目录 一、Docker Hub - 使用搜索 Python二、Python Image 使用1、如何使用此 Image在 Python 应用项目中 创建`Dockerfile`文件运行单个 Python 脚本镜像中的多个 Python 版本2、镜像变体1、`python:<version>`2、`python:<version>-slim`3、`python:<versi…

网络协议都有哪些?

网络协议是为计算机网络中进行数据交换而建立的规则、标准或约定的集合。以下是一些常见的网络协议&#xff1a; TCP/IP协议&#xff1a;传输控制协议/因特网互联协议&#xff0c;又名网络通讯协议&#xff0c;是Internet最基本的协议、Internet国际互联网络的基础。由网络层的…

标准遗传算法-c++源程序

#include〈stdio.h> #include<stdlib.h> #include<time.h> #include<fstream。h〉 #include<windows。h〉 #define POPSIZE 500 #define MAXIMIZATION 1 #define MINIMIZATION 2 #define random(x) (rand()%(x)) #define Cmax 100 …

蓝桥杯真题——三角回文数(C语言)

问题描述 对于正整数 n, 如果存在正整数 k 使得 n123⋯kk(k1)2n123⋯kk(k1)/2​, 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066123⋯36366066123⋯363 。 如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数…

硬件---1电路设计安全要点以及欧姆定律

前言&#xff1a; 一直搞的东西都偏软件&#xff0c;硬件也一直在学&#xff0c;元器件、基础电路知识、PCB设计、模电运放都学的马马虎虎&#xff0c;因此决定进行系统性学习&#xff0c;内容基本来源于手里的视频和书本以及自己的感悟。 一电路安全 1电路安全 在初期基础…

离散无记忆信道

目录 离散无记忆信道输入概率输出概率联合分布概率信道逆向概率一些记号示例1示例2 离散无记忆信道 离散&#xff1a;输入输出字母表都是有限的 无记忆&#xff1a;输出字符 d i d_i di​ 被接收到的概率只依赖于当前的输入 c i c_i ci​, 而与前面的输入无关。 一个离散无记…

Prosre:一款直观的协议发送模拟软件

Proser 是一款直观的协议编辑、发送端模拟软件。 在涉及二进制协议通信的程序开发过程中&#xff0c;我们经常会通过助手类工具编写协议来验证自己的代码&#xff0c;但这些助手对于大协议的编辑非常不友好&#xff0c;这时Proser会协助你轻松的完成测试。 特点 数据直接表达…