hdu 5480|| bestcoder #57 div 2 Conturbatio(前缀和||树状数组)
比较水.
唯一一点需要注意的是...
可能有重复元素...
因为我的思路是用两棵一维树状数组搞..
每个点标记为1
然后看矩形的两个方向中是否至少有一个方向上和等于长度...
所以这样如果有重复元素的话,不处理会出错..
但实际上又没修改..直接前缀和就好了...
树状数组个毛线...
不过看到还有人线段树搞得233333
/*************************************************************************
> File Name: code/bc/#57/1002.cpp
> Author: 111qqz
> Email: rkz2013@126.com
> Created Time: 2015年09月26日 星期六 19时31分10秒
************************************************************************/
1#include<iostream>
2#include<iomanip>
3#include<cstdio>
4#include<algorithm>
5#include<cmath>
6#include<cstring>
7#include<string>
8#include<map>
9#include<set>
10#include<queue>
11#include<vector>
12#include<stack>
13#include<cctype>
14#define y1 hust111qqz
15#define yn hez111qqz
16#define j1 cute111qqz
17#define ms(a,x) memset(a,x,sizeof(a))
18#define lr dying111qqz
19using namespace std;
20#define For(i, n) for (int i=0;i<int(n);++i)
21typedef long long LL;
22typedef double DB;
23const int inf = 0x3f3f3f3f;
24const int N=1E5+7;
25int c[N],d[N];
26int n,m,K,Q;
27bool vx[N],vy[N];
1int lowbit(int x)
2{
3 return x&(-x);
4}
1void update ( int x,int delta)
2{
3 for ( int i = x ; i <= n ; i = i + lowbit(i))
4 {
5 c[i] = c[i] + delta;
6 }
7}
1LL sum ( int x)
2{
3 LL res = 0 ;
4 for ( int i = x ; i >= 1 ; i = i - lowbit(i))
5 {
6 res = res + c[i];
7 }
8 return res;
9}
1void update2( int y,int delta)
2{
3 for ( int i = y ; i <= m ; i = i + lowbit(i))
4 {
5 d[i] = d[i] + delta;
6 }
7}
1LL sum2( int y)
2{
3 LL res = 0 ;
4 for ( int i = y ; i >= 1 ; i = i - lowbit(i))
5 {
6 res = res + d[i];
7 }
8 return res;
1}
2int main()
3{
4 #ifndef ONLINE_JUDGE
5 freopen("in.txt","r",stdin);
6 #endif
7 int T;
8 scanf("%d",&T);
9 while (T--)
10 {
11 ms(c,0);
12 ms(d,0);
13 memset(vx,false,sizeof(vx));
14 memset(vy,false,sizeof(vy));
15 scanf("%d %d %d %d",&n,&m,&K,&Q);
16 for ( int i = 0 ; i <K ; i++)
17 {
18 int x,y;
19 scanf("%d %d",&x,&y);
20 if (!vx[x])
21 {
22 update (x,1);
23 vx [x] = true;
24 }
25 if (!vy[y])
26 {
27 update2 (y,1);
28 vy[y] = true;
29 }
1 }
2 for ( int i = 0 ; i < Q ; i++)
3 {
4 int x1,y1,x2,y2;
5 scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
6 int xx = sum(x2)-sum(x1-1);
7 int yy = sum2(y2)-sum2(y1-1);
8 // cout<<"sum(x2):"<<sum(x2)<<endl;
9 // cout<<"sum(x1-1):"<<sum(x1-1)<<endl;
10 // cout<<"sum(y2):"<<sum(y2)<<endl;
11 // cout<<"sum(y1-1)"<<sum(y1-1)<<endl;
12 // cout<<"xx:"<<xx<<endl;
13 // cout<<"yy:"<<yy<<endl;
14 if (xx>=x2-x1+1||yy>=y2-y1+1)
15 {
16 puts("Yes");
17 }
18 else
19 {
20 puts("No");
21 }
}
}
1 #ifndef ONLINE_JUDGE
2 fclose(stdin);
3 #endif
4 return 0;
5}