P6149 [USACO20FEB] Triangles S.cpp

#include<bits/stdc++.h>
#define int int_fast64_t
#define mod int(1e9+7)
using namespace std;
struct node{
	int x,y;
}a[int(1e5+5)],sum[int(1e5+5)],cnt[int(1e5+5)],ls[int(1e5+5)];
bool iakioi(const node& x,const node& y){
	if(x.x!=y.x)return x.x<y.x;
	return x.y<y.y;
}
bool iamakingioi(const node& x,const node& y){
	if(x.x!=y.x)return x.x<y.x;
	return x.y>y.y;
}
bool iakedioi(const node& x,const node& y){
	if(x.x!=y.x)return x.x>y.x;
	return x.y<y.y;
}
bool iwillakioi(const node& x,const node& y){
	if(x.x!=y.x)return x.x>y.x;
	return x.y>y.y;
}
int32_t main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].y;
		a[i].x+=1e4,a[i].y+=1e4;
	}
	int ans=0;
	sort(a+1,a+n+1,iakioi);
	memset(sum,0,sizeof sum),memset(cnt,0,sizeof cnt),memset(ls,0,sizeof ls);
	for(int i=1;i<=n;i++){
		sum[a[i].x].x=(sum[a[i].x].x+abs(a[i].y-ls[a[i].x].x)*cnt[a[i].x].x)%mod;
		cnt[a[i].x].x++;
		ls[a[i].x].x=a[i].y;
		sum[a[i].y].y=(sum[a[i].y].y+abs(a[i].x-ls[a[i].y].y)*cnt[a[i].y].y)%mod;
		cnt[a[i].y].y++;
		ls[a[i].y].y=a[i].x;
		ans=(ans+sum[a[i].x].x*sum[a[i].y].y)%mod;
	}
	sort(a+1,a+n+1,iamakingioi);
	memset(sum,0,sizeof sum),memset(cnt,0,sizeof cnt),memset(ls,0,sizeof ls);
	for(int i=1;i<=n;i++){
		sum[a[i].x].x=(sum[a[i].x].x+abs(a[i].y-ls[a[i].x].x)*cnt[a[i].x].x)%mod;
		cnt[a[i].x].x++;
		ls[a[i].x].x=a[i].y;
		sum[a[i].y].y=(sum[a[i].y].y+abs(a[i].x-ls[a[i].y].y)*cnt[a[i].y].y)%mod;
		cnt[a[i].y].y++;
		ls[a[i].y].y=a[i].x;
		ans=(ans+sum[a[i].x].x*sum[a[i].y].y)%mod;
	}
	sort(a+1,a+n+1,iakedioi);
	memset(sum,0,sizeof sum),memset(cnt,0,sizeof cnt),memset(ls,0,sizeof ls);
	for(int i=1;i<=n;i++){
		sum[a[i].x].x=(sum[a[i].x].x+abs(a[i].y-ls[a[i].x].x)*cnt[a[i].x].x)%mod;
		cnt[a[i].x].x++;
		ls[a[i].x].x=a[i].y;
		sum[a[i].y].y=(sum[a[i].y].y+abs(a[i].x-ls[a[i].y].y)*cnt[a[i].y].y)%mod;
		cnt[a[i].y].y++;
		ls[a[i].y].y=a[i].x;
		ans=(ans+sum[a[i].x].x*sum[a[i].y].y)%mod;
	}
	sort(a+1,a+n+1,iwillakioi);
	memset(sum,0,sizeof sum),memset(cnt,0,sizeof cnt),memset(ls,0,sizeof ls);
	for(int i=1;i<=n;i++){
		sum[a[i].x].x=(sum[a[i].x].x+abs(a[i].y-ls[a[i].x].x)*cnt[a[i].x].x)%mod;
		cnt[a[i].x].x++;
		ls[a[i].x].x=a[i].y;
		sum[a[i].y].y=(sum[a[i].y].y+abs(a[i].x-ls[a[i].y].y)*cnt[a[i].y].y)%mod;
		cnt[a[i].y].y++;
		ls[a[i].y].y=a[i].x;
		ans=(ans+sum[a[i].x].x*sum[a[i].y].y)%mod;
	}
	cout<<ans;
	return 0;
}
posted @ 2026-08-20 21:15  longyitongxue  阅读(8)  评论(1)    收藏  举报
longint's blog
●

2025-2026, © longint's blog