Conturbatio
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 341 Accepted Submission(s): 155
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?
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≤n,m,K,Q≤100,000.
1≤x≤n,1≤y≤m.
1≤x1≤x2≤n,1≤y1≤y2≤m.
在一個n×m的國際象棋棋盤上有很多車(Rook),其中車可以攻擊他所屬的一行或一列,包括它自己所在的位置。
現在還有很多詢問,每次詢問給定一個棋盤內部的矩形,問矩形內部的所有格子是否都被車攻擊到?
題解:記錄下行攻擊的前綴和及列攻擊的前綴和,每個矩陣只要滿足行攻擊和列攻擊全部攻擊到就是yes.
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int n,m,k,q;
int cs[maxn],rs[maxn];
void init() {
memset(cs,0,sizeof cs);//hang
memset(rs,0,sizeof rs);//lie
}
int main() {
int t;
cin>>t;
int ca=1;
while(t--) {
scanf("%d%d%d%d",&n,&m,&k,&q);
init();
for(int i=0; i<k; i++) {
int x,y;
scanf("%d%d",&x,&y);
cs[x]=1;
rs[y]=1;
}
for(int i=1; i<=n; i++)
cs[i]+=cs[i-1];
for(int i=1; i<=m; i++)
rs[i]+=rs[i-1];
while(q--) {
int lx,ly,rx,ry;
scanf("%d%d%d%d",&lx,&ly,&rx,&ry);
if(cs[rx]-cs[lx-1]==rx-lx+1||(rs[ry]-rs[ly-1]==ry-ly+1)) {
printf("Yes\n");
} else {
printf("No\n");
}
}
}
return 0;
}