【每日一题】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为 ...
随机推荐
- 25 个超棒的 Python 脚本合集
Python是一种功能强大且灵活的编程语言,拥有广泛的应用领域.下面是一个详细介绍25个超棒的Python脚本合集: 1. 网络爬虫:使用Python可以轻松编写网络爬虫,从网页中提取数据并保存为结构 ...
- 使用 VS 2019 将 c# 生成 DLL 动态链接库文件
主要步骤: ChatGPT 的回答: 你可以尝试使用 Visual Studio 创建一个类库项目,然后将你写的两个类添加到该项目中,并进行编译,最终生成 DLL 文件.具体步骤如下: 打开 Visu ...
- v0.12.0-敏感词/脏词词标签能力进一步增强
拓展阅读 敏感词工具实现思路 DFA 算法讲解 敏感词库优化流程 java 如何实现开箱即用的敏感词控台服务? 各大平台连敏感词库都没有的吗? v0.10.0-脏词分类标签初步支持 v0.11.0-敏 ...
- 如何有效应对员工违规使用U盘的情况?
在面对员工违规使用U盘的挑战时,华企盾DSC数据防泄密系统提供了一套综合而高效的解决方案. 通过系统的U盘加密功能,我们能够防止未经授权的U盘访问,确保敏感数据不会被非法传输.这一层保护不仅是基础性的 ...
- C++ 核心指南 —— 性能
C++ 核心指南 -- 性能 阅读建议:先阅读 <性能优化的一般策略及方法> 截至目前,C++ Core Guidelines 中关于性能优化的建议共有 18 条,而其中很大一部分是告诫你 ...
- 为什么要重写equals()?
为什么要重写equals()? Equals和 == 的区别: ==:是个运算符, 判断是否相等,基本数据类型进行判断 也可判断两个对象相等,比较两个对象的哈希码值 Equals:是个Object类的 ...
- Ribbon:Spring Cloud负载均衡与服务调用组件
Ribbon:Spring Cloud负载均衡与服务调用组件 问题总结 负载均衡? Ribbon实现服务调用? Ribbon实现负载均衡? 切换负载均衡策略? 定制负载均衡策略? 问题答案 负载均衡 ...
- Zabbix自带模板监控MySQL服务
Zabbix的服务端与客户端的安装这里不再赘述了,前面也有相应的文章介绍过了,感兴趣的伙伴们可以看看历史文章就可以了,今天主要介绍下如何利用zabbix自带的模板来监控MySQL服务的一些状态,同时通 ...
- jpa整合mybatis模板解析、hibernate整合mybatis模板解析
jpa整合mybatis模板解析.hibernate整合mybatis模板解析 jpa是hibernate的封装,主要用于spring全家桶套餐. hibernate难以编写复杂的SQL.例如一个订单 ...
- 一文了解Vprix容器流媒体平台和传统云桌面的区别、优劣势
在当今数字化时代,随着云计算和远程办公的兴起,云桌面项目成为了提升工作效率和灵活性的重要工具.云桌面项目通过将用户的桌面环境和应用程序虚拟化,为用户提供了随时随地访问个人工作环境的便利.本文将介绍Vp ...