疑问求助
查看原帖
疑问求助
669053
Strelizia_楼主2025/7/21 11:32

请看此段b=2部分的代码

namespace b2 {
	const int M=75010;
	int n,d,m;
	struct node {
		int u,v;
	} p[N];
	int x[N],y[N];
	int tr[3*M];
	int lowbit(int x) {
		return x&-x;
	}
	void update(int x,int d) {
		if(x<=0) return;
		while(x<=3*m ){//
			tr[x]+=d;
			x+=lowbit(x);
		}
	}
	int query(int x) {
		int res=0;
		if(x>3*m)return tr[3*m];//
		while(x>0) {
			res+=tr[x];
			x-=lowbit(x);
		}
		return res;
	}
	void solve() {
		cin>>n>>d>>m;
		for(int i=1; i<=n; i++) {
			cin>>x[i]>>y[i];
			p[i].u=x[i]+y[i]+m;
			p[i].v=x[i]-y[i]+m;
		}
		sort(p+1,p+n+1,[](const node &a,const node &b) {
			return a.u<b.u;
		});
		int j=1;
		long long ans=0;
		for(int i=1; i<=n; i++) {
			while(j<i && p[i].u-p[j].u>d) {
				update(p[j].v,-1);
				j++;
			}
			ans+=query(p[i].v+d)-query(p[i].v-d-1);
			update(p[i].v,1);
		}
		cout<<ans<<"\n";
	}
}

WA on #14

下面是把斜杠处的 m 改为 M 后的

#include<bits/stdc++.h>
using namespace std;
int b;
const int N=1e5+10;
namespace b1 {
	int x[N];
	int n,d,m;
	void solve() {
		cin>>n>>d>>m;
		for(int i=1; i<=n; i++)cin>>x[i];
		sort(x+1,x+n+1);
		int l=1,r=1;
		long long ans=0;
		for(; l<=n; l++) {
			while(x[r+1]-x[l]<=d && r+1<=n)r++;
			ans+=(r-l);
//			cout<<r<<" "<<l<<"\n";
		}
		cout<<ans;
	}
}
namespace b2 {
	const int M=75010;
	int n,d,m;
	struct node {
		int u,v;
	} p[N];
	int x[N],y[N];
	int tr[3*M];
	int lowbit(int x) {
		return x&-x;
	}
	void update(int x,int d) {
		if(x<=0) return;
		while(x<=3*M ){//
			tr[x]+=d;
			x+=lowbit(x);
		}
	}
	int query(int x) {
		int res=0;
		if(x>3*M)return tr[3*M];//
		while(x>0) {
			res+=tr[x];
			x-=lowbit(x);
		}
		return res;
	}
	void solve() {
		cin>>n>>d>>m;
		for(int i=1; i<=n; i++) {
			cin>>x[i]>>y[i];
			p[i].u=x[i]+y[i]+m;
			p[i].v=x[i]-y[i]+m;
		}
		sort(p+1,p+n+1,[](const node &a,const node &b) {
			return a.u<b.u;
		});
		int j=1;
		long long ans=0;
		for(int i=1; i<=n; i++) {
			while(j<i && p[i].u-p[j].u>d) {
				update(p[j].v,-1);
				j++;
			}
			ans+=query(p[i].v+d)-query(p[i].v-d-1);
			update(p[i].v,1);
		}
		cout<<ans<<"\n";
	}
}
namespace b3{
	struct node {
		int u,v,z;
	} p[N];
	int n,d,m;
//	int sum
	void solve(){
		cin>>n>>d>>m;
		for(int i=1;i<=n;i++){
			int x,y,z;
			cin>>x>>y>>z;
			p[i].u=x+y,p[i].v=x-y,p[i].z=z;
//			sum[p[i].u][p[i].v][z]++;
		}
		
	}
}
int main() {
	cin>>b;
	if(b==1) b1::solve();
	if(b==2) b2::solve();
//	if(b==3) b3::solve();
	return 0;
}

没挂

请问是什么原理?

2025/7/21 11:32
加载中...