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;
}

Contest的更多相关文章

  1. Programming Contest Problem Types

        Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...

  2. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. 2016 Multi-University Training Contest 2 D. Differencia

    Differencia Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  4. 2016 Multi-University Training Contest 1 G. Rigid Frameworks

    Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  6. ZOJ 3703 Happy Programming Contest

    偏方记录背包里的物品.....每个背包的价值+0.01 Happy Programming Contest Time Limit: 2 Seconds      Memory Limit: 65536 ...

  7. 2012 Multi-University Training Contest 9 / hdu4389

    2012 Multi-University Training Contest 9 / hdu4389 打巨表,实为数位dp 还不太懂 先这样放着.. 对于打表,当然我们不能直接打,这里有技巧.我们可以 ...

  8. 2014 Multi-University Training Contest 9#11

    2014 Multi-University Training Contest 9#11 Killing MonstersTime Limit: 2000/1000 MS (Java/Others)   ...

  9. 2014 Multi-University Training Contest 9#6

    2014 Multi-University Training Contest 9#6 Fast Matrix CalculationTime Limit: 2000/1000 MS (Java/Oth ...

  10. 校际联合Contest

    每次开一个坑都像是重新被碾压的预感 最近的新闻,以前很喜欢乔任梁的<复活>...然后他就死了...感觉我再多愁善感一点的话...就要悲伤逆流成河了吧... Contest 09/24(乐滋 ...

随机推荐

  1. 在Java中==的一个坑

    观察下面代码,输出结果是什么? public static void main(String[] args) { Integer p = 10000; Integer q = 10000; Syste ...

  2. [AcWing 777] 字符串乘方

    点击查看代码 #include<iostream> using namespace std; string str; int main() { while (cin >> st ...

  3. 自己的~/.vimrc

    " 语法高亮syntax on " 搜索高亮set hlsearch " 显示行号set number" let mapleader="," ...

  4. 离谱的 CSS!从表盘刻度到艺术剪纸

    某日,群里有这样一个问题,如何实现这样的表盘刻度: 这其实是个挺有意思的问题,方法也有很多. 单标签,使用 conic-gradient 实现表盘刻度 最简单便捷的方式,就是利用角向渐变的方式 con ...

  5. FinOps for Kubernetes - 如何拆分 Kubernetes 成本

    本文独立博客阅读地址:https://thiscute.world/posts/finops-for-kubernetes/ 目录 云计算成本管控 Kubernetes 成本分析的难点 Kuberne ...

  6. node技术是啥?

    node.js 一句话,就是把js代码放在服务器段运行的一种技术.

  7. JUC自定义线程池练习

    JUC自定义线程池练习 首先上面该线程池的大致流程 自定义阻塞队列 首先定义一个双向的队列和锁一定两个等待的condition 本类用lock来控制多线程下的流程执行 take和push方法就是死等, ...

  8. 读 Angular 代码风格指南

    读 Angular 代码风格指南 本文写于 2021 年 1 月 17 日 原文地址:Angular 文档 该文章拥有完整的代码风格指南--大到如何编排文件夹,小到如何进行变量命名都涉及.但是与 ng ...

  9. 好客租房8-React基础阶段总结

    React总结 1react是构建用户组件的javascript库 2使用react是,推荐使用脚手架方式 3初始化项目命令:npx create-react-app my-app 4启动项目命令:y ...

  10. 【Unity Shader学习笔记】Unity光照基础-漫反射光照

    本代码只适用于平行光. 1.逐顶点漫反射光照 1.1漫反射光照原理 1.2代码实现 在Properties语义块中声明一个漫反射颜色属性 Properties { //漫反射参数,用于调整漫反射效果 ...