题意
支队伍一共参加了三场比赛。
一支队伍 认为自己比另一支队伍
强当且仅当
在至少一场比赛中比
的排名高。
求有多少组 ,使得
自己觉得比
强,
自己也觉得比
强,
,
算一组。
solution
若 和
都互相认为更强,那么必定存在两场,一场
强于
,一场
强于
,那么就是对于任意两场求逆序数,最后的答案需要除以2,因为如果两队互认为更强,必定存在
有两场更强,或者
有两场更强,那么计算逆序数时就多计算了一次。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 2e5 + 5;
ll n, res, t[N];
struct Node {
ll a, b, c;
} q[N];
bool cmpa(Node x, Node y) { return x.a < y.a; }
bool cmpb(Node x, Node y) { return x.b < y.b; }
void add(ll x) {
while (x <= n) {
t[x]++;
x += x & -x;
}
}
ll query(ll x) {
ll sum = 0;
while (x) {
sum += t[x];
x -= x & -x;
}
return sum;
}
int main() {
cin >> n;
for (ll i = 1; i <= n; i++) cin >> q[i].a >> q[i].b >> q[i].c;
sort(q + 1, q + n + 1, cmpa);
for (ll i = 1; i <= n; i++) {
add(q[i].b);
res += i - query(q[i].b);
}
memset(t, 0, sizeof(t));
for (ll i = 1; i <= n; i++) {
add(q[i].c);
res += i - query(q[i].c);
}
sort(q + 1, q + n + 1, cmpb);
memset(t, 0, sizeof(t));
for (ll i = 1; i <= n; i++) {
add(q[i].c);
res += i - query(q[i].c);
}
cout << res / 2 << '\n';
return 0;
}
京公网安备 11010502036488号