MLE on #7 求助
查看原帖
MLE on #7 求助
593299
Qerucy楼主2024/10/17 08:10

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;
}
2024/10/17 08:10
加载中...