为何这样能过
查看原帖
为何这样能过
531136
astwe楼主2023/1/20 21:30

RT

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>      
#include <string>
#include <queue>
#include <cstring>
#include <map>
#define N 10000005
#define M 500005 
#define ls(x) x<<1
#define rs(x) x<<1|1
#define int long long
using namespace std;
int tree[M<<2];
void ins(int l,int r,int root,int x){
	if(l==r){
		++tree[root];
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)
		ins(l,mid,ls(root),x);
	else
		ins(mid+1,r,rs(root),x);
	tree[root]=tree[ls(root)]+tree[rs(root)];
}
int query(int l,int r,int root,int ll,int rr){
	if(l>=ll&&r<=rr)
		return tree[root];
	int mid=(l+r)>>1;
	int ans=0;
	if(ll<=mid)
		ans+=query(l,mid,ls(root),ll,rr);
	if(rr>mid)
		ans+=query(mid+1,r,rs(root),ll,rr);
	return ans;
}
int n,m,ans1[M],ans2[M];
struct qqq{
	int x,y;
	bool operator <(const qqq &b)const{
		return x<b.x;
	}
}a[M];
struct node{
	int l,r,u,v,id;
}ch[M];
bool cmp1(node a,node b){
	return a.l<b.l;
}
bool cmp2(node a,node b){
	return a.r<b.r;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		cin>>a[i].x>>a[i].y;
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=m;++i){
		cin>>ch[i].l>>ch[i].u>>ch[i].r>>ch[i].v;
		ch[i].id=i;                
	}
	sort(ch+1,ch+m+1,cmp1);
	int you=1;
	a[n+1].x=1e9;
	for(int i=1;i<=m;++i){
		for(int j=you;;++j){
			if(a[j].x>=ch[i].l){
				you=j;
				break;
			}
			ins(0,M,1,a[j].y);
		}
		ans1[ch[i].id]=query(0,M,1,ch[i].u,ch[i].v);
	}
	you=1;
	memset(tree,0,sizeof(tree));
	sort(ch+1,ch+m+1,cmp2);
	for(int i=1;i<=m;++i){
		for(int j=you;;++j){
			if(a[j].x>ch[i].r){
				you=j;
				break;
			}
			ins(0,M,1,a[j].y);
		}
		ans2[ch[i].id]=query(0,M,1,ch[i].u,ch[i].v);
	}
	for(int i=1;i<=m;++i){
		cout<<ans2[i]-ans1[i]<<'\n';
	}
	return 0;
}

我没有离散化,当把M改成N时全MLE了,于是我想想改成M,可是变成现在这样后却AC了,是数据水还是我的写法问题

2023/1/20 21:30
加载中...