Contest

题目

链接

题目描述

\(n\) 支队伍一共参加了三场比赛。

一支队伍 \(x\) 认为自己比另一支队伍 \(y\) 强当且仅当 \(x\) 在至少一场比赛中比 \(y\) 的排名高。

求有多少组 \((x,y)\) ,使得 \(x\) 自己觉得比 \(y\) 强,\(y\) 自己也觉得比 \(x\) 强。

\((x, y), (y, x)\)算一组。

输入描述

第一行一个整数 \(n\) ,表示队伍数; 接下来 \(n\) 行,每行三个整数 \(a[i], b[i], c[i]\) ,分别表示 \(i\) 在第一场、第二场和第三场比赛中的名次;\(n\) 最大不超过 \(200000\)

输出描述

输出一个整数表示满足条件的 \((x,y)\) 数;\(64\) bit请用lld

示例1

输入

4
1 3 1
2 2 4
4 1 2
3 4 3

输出

5

题解

思路

知识点:分治,排序。

这是一道多维偏序题,可以CDQ分治,但鄙人还不会,这里用逆序对的。

注意到,一对的三场比赛至少一强一弱,由于\((x, y), (y, x)\)算一组,因此在计算一场比赛时只管弱或者强的一种可能就行,另一种可能是重复的。

我们对第一场比赛排序,使得 \(i<j\) 时 \(i\) 比 \(j\) 弱。现在去找第二场的逆序对,得到的答案便是第一场弱第二场强的对,但第三场不定;再对第一场排序,找第三场的逆序数,就找到了第一场弱第三场强的对,但第二场不定;再对第二场排序,找第三场的逆序数,就找到了第二场弱第三场强的对,但第一场不定。

于是我们得到了 \(6\) 组情况(1代表强,0代表弱):

序号/场次 第一场 第二场 第三场
1 0 1 1
2 0 1 0
3 0 1 1
4 0 0 1
5 1 0 1
6 0 0 1

我们发现 \(1\) 和 \(3\) 重复了,\(4\) 和 \(6\) 重复了。\(2\) 和 \(5\) 是互反的,由于每个组都是一种情况的全部可能性,而两种情况互反算一组,所以重复了。因此最终答案是三种情况相加除以 \(2\) 。

时间复杂度 \(O(n\log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

struct team {
int a, b, c;
}P[200007]; int Q[200007], R[200007];
long long ans = 0; void merge_sort(int l, int r) {
if (l == r) return;
int mid = l + r >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
int i = l, j = mid + 1, k = l;
while (i <= mid && j <= r) {
if (Q[i] <= Q[j]) R[k++] = Q[i++];
else R[k++] = Q[j++], ans += mid - i + 1;
}
while (i <= mid) R[k++] = Q[i++];
while (j <= r)R[k++] = Q[j++];
for (int i = l;i <= r;i++) Q[i] = R[i];
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 0;i < n;i++) cin >> P[i].a >> P[i].b >> P[i].c; sort(P, P + n, [&](team a, team b) {return a.a < b.a;});
for (int i = 0;i < n;i++) Q[i] = P[i].b;
merge_sort(0, n - 1); for (int i = 0;i < n;i++) Q[i] = P[i].c;
merge_sort(0, n - 1); sort(P, P + n, [&](team a, team b) {return a.b < b.b;});
for (int i = 0;i < n;i++) Q[i] = P[i].c;
merge_sort(0, n - 1); cout << ans / 2 << '\n';
return 0;
}

最新文章

  1. 【04-10】java中的路径
  2. 深入理解Angular中的$Apply()以及$Digest()
  3. Jenkins/CCNET发送邮件策略和注意事项,以及邮箱类型的选择
  4. 货币单位类RmbUnit
  5. POJ1328Radar Installation
  6. lintcode :最小路径和
  7. Oracle_11g中解决被锁定的scott用户的方法(转载)
  8. vim插件:latex-suite 使用方法
  9. web服务构架
  10. ChesFrame框架介绍
  11. Windows编程中的若干难点 - Windows程序设计(SDK)007
  12. ODBC、OLE DB、 ADO、ODAC、ODP.NET
  13. html postMessage 创建聊天应用
  14. Python和Excel交互
  15. 【Python&amp;数据结构】 抽象数据类型 Python类机制和异常
  16. clusterware启动顺序——CRSD
  17. python学习第四天笔记整理
  18. 【MySql】like用法
  19. Spring Boot + Spring Cloud 实现权限管理系统 权限控制(Shiro 注解)
  20. java基础面试题-1

热门文章

  1. 2021.07.26 P1022 计算器的改良(字符串)
  2. 2021.07.26 P1010 幂次方(数论)
  3. 一种O(n)时间复杂度的计数排序算法和Top N热词算法
  4. VXLAN大数据中心组网
  5. 分享一个JDK批量异步任务工具CompletionService,超好用
  6. XCTF练习题---MISC---3-11
  7. 神经网络 CNN 名词解释
  8. ClickHouse 对付单表上亿条记录分组查询秒出, OLAP应用秒杀其他数据库
  9. SpringCloud微服务实战——搭建企业级开发框架(四十):使用Spring Security OAuth2实现单点登录(SSO)系统
  10. 图解Tire树+代码实现