您的位置:首页 > 其它

hdu5480

2015-10-24 21:06 239 查看
题目:点击打开链接

题解:

这道题不能开那么大的二维数组,所以得想个其他办法

可以发现如果一个矩阵被全部攻击到, 

很显然要么是因为它的每一行都有车, 

或者每一列都有车。

所以只需要记录一下哪些行和哪些列有车 

对于每个询问只需要做一个前缀和就可以知道答案了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;
int  a[100001],b[100001];
int main()
{
int t;
int n,m,k,q;
int x,y,x1,y1,x2,y2;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d%d%d%d",&n,&m,&k,&q);
while(k--)
{
scanf("%d%d",&x,&y);
a[x]=1;
b[y]=1;
}
for(int i=1;i<=n;i++)
a[i]+=a[i-1];//每一行代表包括自己的前几行的和
for(int j=1;j<=m;j++)
b[j]+=b[j-1];
while(q--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(a[x2]-a[x1-1]==x2-x1+1||b[y2]-b[y1-1]==y2-y1+1)//只要行全部包括或者列全部包括就可以全部覆盖
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: