离散化二维前缀和求平面矩形个数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
pair<ll,ll>p[2005];
vector<ll>x,y;
int vis[2005][2005];
ll sum[2005][2005];
int n;
bool cmp(pair<ll,ll>a,pair<ll,ll>b) {
if(a.first==b.first) return a.second<b.second;
return a.first<b.first;
}
void discreat() {
sort(x.begin(), x.end());
x.erase(unique(x.begin(), x.end()), x.end());
sort(y.begin(), y.end());
y.erase(unique(y.begin(), y.end()), y.end());
}
inline ll getxid(ll k) {
return lower_bound(x.begin(),x.end(),k)-x.begin()+1;
}
inline ll getyid(ll k) {
return lower_bound(y.begin(),y.end(),k)-y.begin()+1;
}
void gao(int i,int j){
sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+vis[i][j];
}
ll solve(int i,int j,int p,int q){
return sum[p][q]-sum[i-1][q]-sum[p][j-1]+sum[i-1][j-1];
}
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%lld%lld",&p[i].first,&p[i].second);
x.push_back(p[i].first);
y.push_back(p[i].second);
}
discreat();
sort(p+1,p+n+1,cmp);
for(int i=1; i<=n; ++i) {
p[i].first=getxid(p[i].first);
p[i].second=getyid(p[i].second);
vis[p[i].first][p[i].second]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
gao(i,j);
}
}
int ans=0;
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
int xa=p[i].first,xb=p[j].first;
int ya=p[i].second,yb=p[j].second;
if(xb==xa||yb==ya) continue;
if(vis[xa][ya]&&vis[xb][yb]){
if(solve(xa,ya,xb,yb)==4&&vis[xa][yb]&&vis[xb][ya]) ans++;
}
}
}
printf("%d\n",ans);
return 0;
}