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;
}
本文来自博客园,作者:longyitongxue,转载请注明原文链接:https://www.cnblogs.com/Lytx-Luogu1145420/p/22601968/P6149_cpp

浙公网安备 33010602011771号