【NJUST5480】Conturbatio

本文介绍了一种算法,用于判断棋盘上特定矩形区域是否每个格子都能被至少一个车攻击到。输入包括车的位置及待查询的矩形坐标,通过累积计数优化查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                   Conturbatio

Time Limit: 6000/3000 MS (Java/Others)

Memory Limit: 65536/65536 K (Java/Others)

Description

There are many rook on a chessboard, a rook can attack the row and column it belongs, including its own place.

There are also many queries, each query gives a rectangle on the chess board, and asks whether every grid in the rectangle will be attacked by any rook?

Input

The first line of the input is a integer $T$, meaning that there are $T$ test cases.

Every test cases begin with four integers $n , m , K , Q$.
$K$ is the number of Rook, $Q$ is the number of queries.

Then $K$ lines follow, each contain two integers $x , y$ describing the coordinate of Rook.

Then $Q$ lines follow, each contain four integers $x1, y1, x2, y2$ describing the left-down and right-up coordinates of query.

$1\leq n , m , K , Q \leq 100,000$.

$1\leq x \leq n , 1 \leq y \leq m$.

$1\leq x1 \leq x2 \leq n , 1 \leq y1 \leq y2 \leq m$.

Output

For every query output "Yes" or "No" as mentioned above.

Sample Input

     
2 2 2 1 2 1 1 1 1 1 2 2 1 2 2 2 2 2 1 1 1 1 2 2 1 2 2

Sample Output

     
Yes No Yes
Hint
Huge input, scanf recommended.

Hint

hujie

Source

BestCoder Round #57 (div.2)

一道比较好的思维题目

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100000+10;
int row[N],col[N];
int main() {
	int T;
	scanf("%d",&T);
	while(T--) {
		memset(row,0,sizeof(row));
		memset(col,0,sizeof(col));
		int n,m,k,q;
		scanf("%d%d%d%d",&n,&m,&k,&q);
		for(int i=0; i<k; i++) {
			int a,b;
			scanf("%d%d",&a,&b);
			row[a]=1;
			col[b]=1;
		}
		for(int i=1; i<=n; i++) {
			row[i]=row[i]+row[i-1];
		}
		for(int i=1; i<=m; i++) {
			col[i]=col[i]+col[i-1];
		}
		while(q--) {
			int x1,y1,x2,y2;
			scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
			if(x2-x1+1==row[x2]-row[x1-1]||y2-y1+1==col[y2]-col[y1-1])
				printf("Yes\n");
			else
				printf("No\n");
		}
	}
	return 0;
}
题目地址:http://acm.hust.edu.cn/vjudge/contest/127335#problem/A



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值