rt,怎么优化空间
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int maxn;
int read(){
int x=0,c=getchar();
while(c>'9'||c<'0') c=getchar();
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x;
}
struct node{
int x,y;
bool operator <(const node &A)const{
if(x!=A.x) return x<A.x;
return y<A.y;
}
}a[500010],c[3000010];
struct query{
int a,b,c,d;
}q[500010];
int b[3000010];
int cnt,tot;
bool cmp(node a,node b){
if(a.x!=b.x) return a.x<b.x;
return a.y<b.y;
}
map<node,bool>vis;
map<node,int>sum;
map<node,int>qz;
int tree[3000010];
int lowbit(int x){
return x&(-x);
}
void update(int x,int k){
for(int i=x;i<=maxn;i+=lowbit(i)){
tree[i]+=k;
}
}
int query(int x){
int ans=0;
for(int i=x;i>=1;i-=lowbit(i)){
ans+=tree[i];
}
return ans;
}
int main(){
n=read();
m=read();
b[++cnt]=-1;
for(int i=1;i<=n;i++){
a[i].x=read();
a[i].y=read();
//scanf("%d%d",&a[i].x,&a[i].y);
//if(can[(node){a[i].x,a[i].y}]) continue;
//can[(node){a[i].x,a[i].y}]=1;
b[++cnt]=a[i].x;
b[++cnt]=a[i].y;
}
for(int i=1;i<=m;i++){
q[i].a=read();
q[i].b=read();
q[i].c=read();
q[i].d=read();
//scanf("%d%d%d%d",&q[i].a,&q[i].b,&q[i].c,&q[i].d);
b[++cnt]=q[i].a;
b[++cnt]=q[i].b;
b[++cnt]=q[i].c;
b[++cnt]=q[i].d;
}
sort(b+1,b+1+cnt);
for(int i=1;i<=n;i++){
a[i].x=lower_bound(b+1,b+1+cnt,a[i].x)-b;
a[i].y=lower_bound(b+1,b+1+cnt,a[i].y)-b;
tot++;
c[tot].x=a[i].x;
c[tot].y=a[i].y;
sum[(node){a[i].x,a[i].y}]++;
maxn=max(maxn,a[i].y);
}
for(int i=1;i<=m;i++){
q[i].a=lower_bound(b+1,b+1+cnt,q[i].a)-b;
q[i].b=lower_bound(b+1,b+1+cnt,q[i].b)-b;
q[i].c=lower_bound(b+1,b+1+cnt,q[i].c)-b;
q[i].d=lower_bound(b+1,b+1+cnt,q[i].d)-b;
tot++;
c[tot].x=q[i].a-1;
c[tot].y=q[i].b-1;
tot++;
c[tot].x=q[i].c;
c[tot].y=q[i].d;
tot++;
c[tot].x=q[i].a-1;
c[tot].y=q[i].d;
tot++;
c[tot].x=q[i].c;
c[tot].y=q[i].b-1;
maxn=max(maxn,q[i].b);
maxn=max(maxn,q[i].d);
}
sort(c+1,c+1+tot,cmp);
for(int i=1;i<=tot;i++){
if(vis[(node){c[i].x,c[i].y}]) continue;
vis[(node){c[i].x,c[i].y}]=1;
update(c[i].y,sum[(node){c[i].x,c[i].y}]);
qz[(node){c[i].x,c[i].y}]=query(c[i].y);
}
//for(int i=1;i<=tot;i++){
// printf("qwq %d %d\n",c[i].x,c[i].y);
//}
for(int i=1;i<=m;i++){
int sum1=qz[(node){q[i].a-1,q[i].b-1}];
int sum2=qz[(node){q[i].c,q[i].d}];
int sum3=qz[(node){q[i].a-1,q[i].d}];
int sum4=qz[(node){q[i].c,q[i].b-1}];
printf("%d\n",sum2+sum1-sum3-sum4);
}
return 0;
}