cf 1569D - Inconvenient Pairs
(由于感觉代码很优美想记录下来,当然代码重复的部分写成函数就更好了
题目链接
方法:按x排序,顺次更新记录某列(y)的cnt, y同理
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
const int N = 3e5+10;
int n, m, k;
pii p[N];
int x[N], y[N];
int cntx[N], cnty[N];
int find(int a, int x[], int len) {
return lower_bound(x, x+len, a) - x;
}
bool cmp(pii a, pii b) {
if(a.y > b.y) return 0;
if(a.y < b.y) return 1;
return a.x < b.x;
}
int main() {
int T;
scanf("%d", &T);
while(T -- ) {
memset(cnty, 0 ,sizeof(cnty));
memset(cntx, 0 ,sizeof(cntx));
scanf("%d%d%d", &n, &m, &k);
for(int i = 0; i < n; i++) scanf("%d", &x[i]);
for(int i = 0; i < m; i++) scanf("%d", &y[i]);
for(int i = 0; i < k; i++) scanf("%d%d", &p[i].x, &p[i].y);
sort(x, x+n);
sort(y, y+m);
sort(p, p+k);
ll ans = 0;
int lastx = find(p[0].x, x, n), lasty = find(p[0].y, y, m);
int cnt = 0;
for(int i = 0; i < k; i++) {
int a = p[i].x, b = p[i].y;
int ra = find(a, x, n), rb = find(b, y, m);
if(a == x[ra] && b == y[rb]) continue;
if(a == x[ra]) {
if(ra == lastx && rb == lasty) {
cnt++;
}
else {
cnty[lasty] += cnt;
lastx = ra, lasty = rb;
cnt = 1;
}
ans += cnty[rb];
}
}
sort(p, p+k, cmp);
lastx = find(p[0].x, x, n), lasty = find(p[0].y, y, m);
cnt = 0;
for(int i = 0; i < k; i++) {
int a = p[i].x, b = p[i].y;
int ra = find(a, x, n), rb = find(b, y, m);
if(a == x[ra] && b == y[rb]) continue;
if(b == y[rb]) {
if(ra == lastx && rb == lasty) {
cnt++;
}
else {
cntx[lastx] += cnt;
lastx = ra, lasty = rb;
cnt = 1;
}
ans += cntx[ra];
}
}
printf("%lld\n", ans);
}
return 0;
}