#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,希望被解答