【每日一题】39. Contest(树状数组 / 容斥分治)
补题链接:Here
算法涉及:树状数组、CDQ分治
n支队伍一共参加了三场比赛。
一支队伍x认为自己比另一支队伍y强当且仅当x在至少一场比赛中比y的排名高。
求有多少组(x,y),使得x自己觉得比y强,y自己也觉得比x强。
(x, y), (y, x)算一组。
【方案一】树状数组求逆序数
我们转换问题,x要比y最少一门排名高,y也对x同样如此。
那么就变成了,x有2门比y排名高,或者x2门比y排名低。因为排名不可能相同。
那么题目就变成了求逆序数问题,可以按照某一门排名去放另外一门成绩,求到的逆序数就是只看这两门的情况。
那么对于合理的x,y找到排名高,和排名低各一次,直接把答案除以2。
using ll = long long;
const int N = 2e5 + 10;
int a[N], b[N], c[N];
int tmp[N], sum[N];
int n;
int lowbit(int x) {return x & (-x);}
void add(int p, int val) {
for (; p <= n; p += lowbit(p))sum[p] += val;
}
ll query(int i) {
ll ans = 0;
for (; i; i -= lowbit(i))ans += sum[i];
return ans;
}
ll check(int a[], int b[]) {
memset(sum, 0, sizeof(sum));
for (int i = 1; i <= n; ++i)tmp[a[i]] = b[i];
ll ans = 0;
for (int i = 1; i <= n; ++i) {
ans += query(n) - query(tmp[i]);
add(tmp[i], 1);
}
return ans;
}
void solve() {
cin >> n;
for (int i = 1; i <= n; ++i)cin >> a[i] >> b[i] >> c[i];
cout << (check(a, b) + check(a, c) + check(b, c)) / 2;
}
【方案二】容斥思想
容斥思想, 不考虑任何限制,总共有 \(p =n(n - 1) / 2\) 种组合
我们要求题目给的限制方案不好求,逆向思维求不符合的情况
显然不符合的情况是一个三维偏序 \(a[i] > a[j], b[i] > b[j], c[i] > c[j]\)
三维偏序问题可以用 cdq 分治去解决,这里就不赘述了
得到三维偏序的方案为 res
那么答案就是 p - res
using ll = long long;
struct node {
int x, y, z;
bool operator < (const node &s) {
return x < s.x;
}
} a[200005], b[200005];
ll p;
ll t[200005];
int lowbit(int x) {
return x & (-x);
}
void add(int x, int y) {
while (x < 200005) {
t[x] += y;
x += lowbit(x);
}
}
ll sum(int x) {
ll ans = 0;
while (x) {
ans += t[x];
x -= lowbit(x);
}
return ans;
}
void cdq(int l, int r) {
if (l == r) return ;
int mid = l + r >> 1;
cdq(l, mid); cdq(mid + 1, r);
int L = l, R = mid + 1, tot = l;
while (L <= mid && R <= r) {
if (a[L].y <= a[R].y) add(a[L].z, 1), b[tot++] = a[L++];
else p -= sum(a[R].z), b[tot++] = a[R++];
}
while (L <= mid) {
add(a[L].z, 1);
b[tot++] = a[L++];
}
while (R <= r) {
p -= sum(a[R].z);
b[tot++] = a[R++];
}
for (int i = l; i <= mid; i++) add(a[i].z, -1);
for (int i = l; i <= r; i++) a[i] = b[i];
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].x >> a[i].y >> a[i].z;
}
p = 1LL * n * (n - 1) / 2;
sort(a + 1, a + 1 + n);
cdq(1, n);
cout << p << "\n";
return 0;
}
【每日一题】39. Contest(树状数组 / 容斥分治)的更多相关文章
- 【BZOJ4361】isn 动态规划+树状数组+容斥
[BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...
- bzoj4361 isn (dp+树状数组+容斥)
我们先设f[i][j]表示长度为i,以j结尾的不降子序列个数,$f[i][j]=\sum{f[i-1][k]},A[k]<=A[j],k<j$,用树状数组优化一下可以$O(n^2logn) ...
- BZOJ.4361.isn(DP 树状数组 容斥)
题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...
- 【BZOJ 4361】 4361: isn (DP+树状数组+容斥)
4361: isn Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 218 Solved: 126 Description 给出一个长度为n的序列A( ...
- BZOJ 3132(上帝造题的七分钟-树状数组求和+2D逆求和数组)
3132: 上帝造题的七分钟 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 46 Solved: 18[Submit][Status][Discus ...
- 【BZOJ3132】上帝造题的七分钟 [树状数组]
上帝造题的七分钟 Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description “第一分钟,X说,要有矩阵 ...
- [luogu] P4514 上帝造题的七分钟 (树状数组,二维差分)
P4514 上帝造题的七分钟 题目背景 裸体就意味着身体. 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a ...
- 北京网赛I题 hiho1391 (树状数组、区间覆盖最大值问题)
题目链接:http://hihocoder.com/problemset/problem/1391 题意:A国和B国向对方分别投射N枚和M枚导弹(发射时间,飞行时间,伤害值),同时两国各自都有防御系统 ...
- bzoj1818 内部白点(好题) 离散化+树状数组
题目传送门 题意:给出很多黑点,当一个坐标上下左右都有黑点时,这个点也被染成黑色,问最后黑点的数量. 思路:首先,一个很显然的结论,不可能出现无限染色的情况.所以不会输出-1,当n为0或者1时,答案就 ...
- 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)
BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...
随机推荐
- 【Javaweb】做一个房产信息管理系统二
由于我还不太熟练用sql语句写数据库,所以直接用navicate了 我们需要新建四个数据表: adimin(超级管理员信息) customer(顾客) property(房产信息) realestat ...
- 深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析
本文分享自华为云社区<深入理解HarmonyOS UIAbility:生命周期.WindowStage与启动模式探析>,作者:柠檬味拥抱. UIAbility组件概述 UIAbility组 ...
- [ABC311G] One More Grid Task
Problem Statement There is an $N \times M$ grid, where the square at the $i$-th row from the top and ...
- [ABC310G] Takahashi And Pass-The-Ball Game
Problem Statement There are $N$ Takahashi. The $i$-th Takahashi has an integer $A_i$ and $B_i$ balls ...
- python在使用过程中安装库的方法
背景: 在学习python的过程中难免会出现python解释器中没有所需要的库,这时我们就要自行的去安装这些库了:当然如果使用的anaconda集成环境的话在安装python一些依赖环境中会简单不少( ...
- 如何对U盘的使用权限进行管控
对U盘的使用权限进行管控是保护企业信息安全的一项重要措施.以下是一些常见的方法,可帮助您有效管理和控制U盘的使用权限: 禁用U盘端口: 在公司计算机上禁用或限制USB端口的使用,特别是那些不需要使用U ...
- Deployment控制器
目录 Deployment控制器 1.deployment及副本数 使用命令生产yaml文件模板 控制器通过什么管理pod? 2.副本数修改方法 3.动态扩展HPA 4.镜像滚动升级及回滚 升级 回退 ...
- macOS 安装 clang-tidy
先安装 homebrew,网上教程很多,推荐官方教程,此处略过 通过 brew 安装 llvm brew install llvm 创建软连接,指向 homebrew 安装的 clang-tidy m ...
- CSS之动画
一.动画 动画类型 CSS3 可以创建动画,它可以取代许多网页动画图像.Flash 动画和 JavaScript 实现的效果. transform属性可以定义一些主要的动画属性, translate: ...
- flutter常用的音乐播放器库
audioplayers: 优势:audioplayers 是一个简单易用的音乐播放器库,支持主流平台(Android.iOS)并提供了丰富的功能,比如播放.暂停.快进.音量控制等. 缺点:audio ...