没用离散化可以吗?
查看原帖
没用离散化可以吗?
690320
MoGuYun_12楼主2024/11/3 18:51

仅过#4

#include <bits/stdc++.h>

using namespace std;
#define N 10000005

int n,m,cnt;
int c[N],ans[N<<2];
struct tree{
	int x,y;
}t[500005];
struct query{
	int id,x,y;
}a[N<<2];

bool cmp1(tree a,tree b){
	if(a.x==b.x) return a.y<b.y;
	return a.x<b.x;
}
bool cmp2(query a,query b){
	if(a.x==b.x) return a.y<b.y;
	return a.x<b.x;
}

void add(int x){ //下标从零开始,整体加1 
	for(int i=x+1;i<=10000001;i+=i&(-i)) c[i]++; 
}
int gsum(int x){
	int res=0;
	for(int i=x+1;i;i-=i&(-i)) res+=c[i];
	return res;
}

int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>t[i].x>>t[i].y;
	for(int i=1;i<=m;i++){
		int ax,ay,bx,by; cin>>ax>>ay>>bx>>by;
		cnt++; a[cnt]=query{cnt,bx,by};
		cnt++; a[cnt]=query{cnt,ax-1,by};
		cnt++; a[cnt]=query{cnt,bx,ay-1};
		cnt++; a[cnt]=query{cnt,ax-1,ay-1};
	}
	sort(t+1,t+n+1,cmp1);
	sort(a+1,a+cnt+1,cmp2);
	int cur=1;
	for(int i=1;i<=cnt;i++){
		while(cur<=n && t[cur].x<=a[i].x){
			add(t[cur].y); cur++;
		}
		ans[a[i].id]+=gsum(a[i].y);
	}
	for(int i=1;i<=cnt;i+=4)
		cout<<ans[i]-ans[i+1]-ans[i+1]+ans[i+3]<<endl;
	return 0;
}

2024/11/3 18:51
加载中...