蒟蒻求助二维数点板子题,WA9个点求指导,手模几个样例都是对的qwq
  • 板块学术版
  • 楼主Peter3245127684
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/7/26 20:44
  • 上次更新2023/11/6 22:11:54
查看原帖
蒟蒻求助二维数点板子题,WA9个点求指导,手模几个样例都是对的qwq
223362
Peter3245127684楼主2020/7/26 20:44
#include<bits/stdc++.h>
#define N 500010
#define logN 20
using namespace std;
struct node
{
	int l,r,siz,L,R;
}tree[N*logN];
struct Read
{
	int x,y;
}a[N];
struct Query
{
	int lx,ly,rx,ry;
}q[N];
int n,m,Len,cnt;
int root[N],arr[N*6];
template <typename T>
inline T read(T &x)
{
	T flg=1;x=0;
	char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-') flg=-flg;ch=getchar();}
	while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*=flg;
}
template <typename T>
inline void write(T x)
{
	if(x<0) x=-x,putchar('-');
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
template <typename T>
inline void writeln(T x) {write(x);puts("");}
template <typename T>
inline void writesp(T x) {write(x);putchar(' ');}
inline int cmp(Read x,Read y) {return x.x^y.x?x.x<y.x:x.y<y.y;}
inline void updata(int i)
{
	tree[i].siz=tree[tree[i].l].siz+tree[tree[i].r].siz;
}
inline int build(int l,int r)
{
	int k=++cnt;
	tree[k].siz=0;
	tree[k].L=l;
	tree[k].R=r;
	if(l<r)
	  {
	  	int mid=l+r>>1;
	  	tree[k].l=build(l,mid);
	  	tree[k].r=build(mid+1,r);
	  }
	return k;
}
inline int modify(int p,int l,int r,int x)
{
	int k=++cnt;
	tree[k].siz=tree[p].siz+1;
	tree[k].l=tree[p].l;
	tree[k].r=tree[p].r;
	tree[k].L=l;
	tree[k].R=r;
	if(l<r)
	  {
	  	int mid=l+r>>1;
	  	if(x<=mid) tree[k].l=modify(tree[p].l,l,mid,x);
	  	else tree[k].r=modify(tree[p].r,mid+1,r,x);
	  }
	return k;
}
inline void Add(int i,int Node)
{
	if(tree[i].L==tree[i].R&&tree[i].L==Node)
	  {
	  	++tree[i].siz;
	  	return;
	  }
	int mid=tree[i].L+tree[i].R>>1;
	if(Node<=mid) Add(tree[i].l,Node);
	if(Node>mid) Add(tree[i].r,Node);
	updata(i);
}
inline int query(int p,int q,int l,int r)
{
	if(tree[q].L>=l&&tree[q].R<=r) return tree[q].siz-tree[p].siz;
	int mid=tree[q].L+tree[q].R>>1;
	int res=0;
	if(l<=mid) res+=query(tree[p].l,tree[q].l,l,r);
	if(r>mid) res+=query(tree[p].r,tree[q].r,l,r);
	return res;
}
signed main()
{
	read(n);read(m);
	for(register int i=1;i<=n;++i)
	  {
	  	arr[++Len]=read(a[i].x);
		arr[++Len]=read(a[i].y);
	  }
	for(register int i=1;i<=m;++i)
	  {
	  	arr[++Len]=read(q[i].lx);
		arr[++Len]=read(q[i].ly);
	  	arr[++Len]=read(q[i].rx);
		arr[++Len]=read(q[i].ry);
	  }
	sort(arr+1,arr+Len+1);
	int len=unique(arr+1,arr+Len+1)-arr-1;
	for(register int i=1;i<=n;++i)
	  {
	  	a[i].x=lower_bound(arr+1,arr+len+1,a[i].x)-arr;
	  	a[i].y=lower_bound(arr+1,arr+len+1,a[i].y)-arr;
	  }
	for(register int i=1;i<=m;++i)
	  {
	  	q[i].lx=lower_bound(arr+1,arr+len+1,q[i].lx)-arr;
	  	q[i].ly=lower_bound(arr+1,arr+len+1,q[i].ly)-arr;
	  	q[i].rx=lower_bound(arr+1,arr+len+1,q[i].rx)-arr;
	  	q[i].ry=lower_bound(arr+1,arr+len+1,q[i].ry)-arr;
	  }
	int top=1;
	root[0]=build(1,len);
	sort(a+1,a+n+1,cmp);
	for(register int i=1;i<=len;++i)
	  if(a[top].x==i)
		{
		  root[i]=modify(root[i-1],1,len,a[top++].y);
		  while(a[top].x==i&&top<=n) Add(root[i],a[top++].y);
		}
	  else root[i]=root[i-1];
	for(register int i=1;i<=m;++i)
	  writeln(query(root[q[i].lx-1],root[q[i].rx],q[i].ly-1,q[i].ry));
	return 0;
}

/*
5 2
1 10
6 11
2 2
2 1 
7 10
2 2 8 18
0 0 8 18
*/
2020/7/26 20:44
加载中...