제출 #1325308

#제출 시각아이디문제언어결과실행 시간메모리
1325308boclobanchatPairs (IOI07_pairs)C++20
100 / 100
88 ms11816 KiB
#include<bits/stdc++.h>
using namespace std;
struct point { int x,y,z; };
struct query { int t,l,r,v; };
const int MAXN=183667;
int fen[MAXN],pref[77][177][177],A[MAXN];
vector<query> vq[MAXN];
point P[MAXN];
void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]+=val; }
int get(int i) { int ans=0;for(;i;i-=i&-i) ans+=fen[i];return ans; }
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int b,n,d,m;
	cin>>b>>n>>d>>m;
	if(b==1)
	{
		for(int i=1;i<=n;i++) cin>>A[i];
		sort(A+1,A+n+1);
		long long ans=0;
		for(int i=1;i<=n;i++) ans+=upper_bound(A+1,A+n+1,A[i]+d)-A-i-1;
		cout<<ans;
	}
	else if(b==2)
	{
		for(int i=1;i<=n;i++)
		{
			int x,y;
			cin>>x>>y;
			int u=x-y+m,v=x+y;
			vq[u].push_back({1,v,1,1});
			vq[max(1,u-d)-1].push_back({2,max(1,v-d),min(m*2,v+d),-1});
			vq[min(m*2,u+d)].push_back({2,max(1,v-d),min(m*2,v+d),1});
		}
		long long ans=0;
		for(int i=1;i<=m*2;i++)
		{
			for(auto v:vq[i]) if(v.t==1) update(v.l,m*2,1);
			for(auto v:vq[i]) if(v.t==2) ans+=(get(v.r)-get(v.l-1))*v.v;
		}
		cout<<(ans-n)/2;
	}
	else
	{
		for(int i=1;i<=n;i++)
		{
			int x,y,z;
			cin>>x>>y>>z;
			P[i]={x,y-z+m,y+z};
			pref[x][P[i].y][P[i].z]++;
		}
		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=m*2;j++) for(int k=1;k<=m*2;k++) pref[i][j][k]+=pref[i][j-1][k];
			for(int j=1;j<=m*2;j++) for(int k=1;k<=m*2;k++) pref[i][j][k]+=pref[i][j][k-1];
		}
		long long ans=0;
		for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
		{
			int z=d-abs(j-P[i].x);
			if(z>=0)
			{
				ans+=pref[j][min(m*2,P[i].y+z)][min(m*2,P[i].z+z)];
				ans-=pref[j][max(1,P[i].y-z)-1][min(m*2,P[i].z+z)];
				ans-=pref[j][min(m*2,P[i].y+z)][max(1,P[i].z-z)-1];
				ans+=pref[j][max(1,P[i].y-z)-1][max(1,P[i].z-z)-1];
			}
		}
		cout<<(ans-n)/2;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...