题意:给
n
个点,问满足
思路:显然当
x
或者
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define CLR(a, b) memset(a, (b), sizeof(a))
#define fi first
#define se second
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int MAXN = 2*1e5+10;
const int INF = 0x3f3f3f3f;
void getmax(int &a, int b) {a = max(a, b); }
void getmin(int &a, int b) {a = min(a, b); }
map<pii, int> fp;
pii a[MAXN], b[MAXN];
bool cmp(pii a, pii b) {
return a.fi != b.fi ? a.fi < b.fi : a.se < b.se;
}
int main()
{
int n; scanf("%d", &n); fp.clear();
for(int i = 0; i < n; i++)
{
scanf("%d%d", &a[i].fi, &a[i].se);
fp[a[i]]++;
b[i].fi = a[i].se; b[i].se = a[i].fi;
}
sort(a, a+n, cmp);
LL ans = 0;
for(int i = 0; i < n; i++)
{
int pos = lower_bound(a+i, a+n, pii(a[i].fi+1, -INF)) - a;
//cout << pos << endl;
if(pos > i) ans += 1LL * (pos - i - 1);
}
//cout << ans << endl;
sort(b, b+n, cmp);
for(int i = 0; i < n; i++)
{
int pos = lower_bound(b+i, b+n, pii(b[i].fi+1, -INF)) - b;
if(pos > i) ans += 1LL * (pos - i - 1);
}
//cout << ans << endl;
int top = unique(a, a+n) - a;
for(int i = 0; i < top; i++)
ans -= 1LL * (fp[a[i]] - 1) * fp[a[i]] / 2;
cout << ans << endl;
return 0;
}