关于本题去重离奇出错(悬关)
查看原帖
关于本题去重离奇出错(悬关)
751442
mortis_life楼主2024/10/4 19:11
#include<bits/stdc++.h>
#define int long long
using namespace std;

inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
		x=x*10+ch-'0',ch=getchar();
	return x*f;
}

int n,m,tot,a,b,c,d,ans[5000500];

struct node {
	int x,y,w,id,e;
//	node() { x=0,y=0,w=0,id=0,e=0; }
}f[500500],g[1400500];
bool c1(node a,node b) {
	if(a.x^b.x) return a.x<b.x;
	else if(a.y^b.y) return a.y<b.y;
	else return a.id<b.id;
}
bool cmp(node a,node b) {
//	if(a.y^b.y) 
	return a.y<b.y;
//	else return a.w>b.w;
}

void CDQ(int l,int r) {
	if(l==r) return ;
	int mid=l+r>>1;
	CDQ(l,mid),CDQ(mid+1,r);
	int p1=l,sum=0;
	for(int i=mid+1;i<=r;i++) {
		while(!g[i].id&&i<r) i++;
		while(g[p1].y<=g[i].y&&p1<=mid) sum+=g[p1].w,p1++;
		if(g[i].id) ans[g[i].id]+=g[i].e*sum;
	}
	inplace_merge(g+l,g+mid+1,g+r+1,cmp);
}

signed main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		f[i].x=read(),f[i].y=read();
//		g[i].x=read(),g[i].y=read();
//		g[i].w=1;
	}
//	tot=n;
	sort(f+1,f+1+n,c1);
	g[++tot]=f[1];g[tot].w=1;
	for(int i=2;i<=n;i++) {
		if(f[i].x==g[tot].x&&f[i].y==g[tot].y) g[tot].w++;
		else g[++tot]=f[i],g[tot].w=1;
	}
//	if(tot==n) cout<<-1;
	for(int i=1;i<=m;i++) {
		a=read(),b=read(),c=read(),d=read();
		a--,b--;
		g[++tot].x=a,g[tot].y=b;g[tot].id=i;g[tot].e=1;
		g[++tot].x=a,g[tot].y=d;g[tot].id=i;g[tot].e=-1;
		g[++tot].x=c,g[tot].y=b;g[tot].id=i;g[tot].e=-1;
		g[++tot].x=c,g[tot].y=d;g[tot].id=i;g[tot].e=1;
	}
	sort(g+1,g+1+tot,c1);
//	for(int i=1;i<=tot;i++) {
//		printf("%d %d %d %d %d\n",g[i].x,g[i].y,g[i].w,g[i].id,g[i].e);
//	}
	CDQ(1,tot);
	for(int i=1;i<=m;i++) {
		printf("%d\n",ans[i]);
	}
	return 0;
}

其中去重操作

sort(f+1,f+1+n,c1);
	g[++tot]=f[1];g[tot].w=1;
	for(int i=2;i<=n;i++) {
		if(f[i].x==g[tot].x&&f[i].y==g[tot].y) g[tot].w++;
		else g[++tot]=f[i],g[tot].w=1;
	}

是错的

sort(f+1,f+1+n,c1);
	g[++tot]=f[1];
	for(int i=1;i<=n;i++) {
		if(f[i].x==g[tot].x&&f[i].y==g[tot].y) g[tot].w++;
		else g[++tot]=f[i],g[tot].w=1;
	}

是对的,甚至不加去重操作也是对的,而上种写发WA ON 4,希望被解答

2024/10/4 19:11
加载中...