补题链接: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(树状数组 / 容斥分治)的更多相关文章

  1. 【BZOJ4361】isn 动态规划+树状数组+容斥

    [BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...

  2. 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) ...

  3. BZOJ.4361.isn(DP 树状数组 容斥)

    题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...

  4. 【BZOJ 4361】 4361: isn (DP+树状数组+容斥)

    4361: isn Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 218  Solved: 126 Description 给出一个长度为n的序列A( ...

  5. BZOJ 3132(上帝造题的七分钟-树状数组求和+2D逆求和数组)

    3132: 上帝造题的七分钟 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 46  Solved: 18[Submit][Status][Discus ...

  6. 【BZOJ3132】上帝造题的七分钟 [树状数组]

    上帝造题的七分钟 Time Limit: 20 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description “第一分钟,X说,要有矩阵 ...

  7. [luogu] P4514 上帝造题的七分钟 (树状数组,二维差分)

    P4514 上帝造题的七分钟 题目背景 裸体就意味着身体. 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a ...

  8. 北京网赛I题 hiho1391 (树状数组、区间覆盖最大值问题)

    题目链接:http://hihocoder.com/problemset/problem/1391 题意:A国和B国向对方分别投射N枚和M枚导弹(发射时间,飞行时间,伤害值),同时两国各自都有防御系统 ...

  9. bzoj1818 内部白点(好题) 离散化+树状数组

    题目传送门 题意:给出很多黑点,当一个坐标上下左右都有黑点时,这个点也被染成黑色,问最后黑点的数量. 思路:首先,一个很显然的结论,不可能出现无限染色的情况.所以不会输出-1,当n为0或者1时,答案就 ...

  10. 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)

    BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...

随机推荐

  1. CF1881C Perfect Square 题解

    思路 简单滴很,对于每一组 \((i,j)\) 找出其对应的三个点,减一减就完了. 对应的点是哪三个呢?显然是 \((n-i+1,n-j+1)\),\((j,n-i+1)\) 以及 \((i,n-j+ ...

  2. GPTs 初体验 - 1 分钟就能创建一个自己的 ChatGPT?

    就在 11.10 号早上,ChatGPT 已经偷摸的把GPTs功能,开放给所有尊贵的 Plus 用户了. 随着这波的功能开放,界面也是改了不少.点击左侧的 Explore 或者左下角的用户处,就可以直 ...

  3. 黑客玩具入门——4、漏洞扫描与Metasploit

    1.Legion漏洞扫描分析工具 Legion是Sparta的一个分支,它是一个开源的.易于使用的.超级可扩展的.半自动的网络渗透测试框架.它是一款Kali Linux系统默认集成的Python GU ...

  4. jmeter-逻辑处理器while

    测试工具:jmeter 业务逻辑:A接口上传文件,B接口查询文件上传状态,如果状态不为4,需要再次查询(上传文件后,需要有短暂时间的识别,压测时并发大导致识别时间不可控)当为4时,跳出循环, 思路:增 ...

  5. svn、git服务器配置进程方式网关不生效常见处理方法

    过华企盾DSC防泄密系统配置svn或者git服务器的时候,网关不生效如何解决? 1.先在cmd中运行一下命令netstat -ano|findstr "8080" 找到svn.gi ...

  6. MYSQL数据库root账户密码忘记,如何重置?

  7. Ubuntu 下建立 eclipse 启动图标,解决ADT没有菜单栏问题(转载)

    原文地址 怎么在这应用程序里边建立图标$sudo gedit /usr/share/applications/Eclipse.desktop输入以下代码 [Desktop Entry]Name=Ecl ...

  8. 数据结构入门之单链表代码实现(java)

    1:单链表是: 单链表是一种链式存取的 数据结构 用一组地址任意的 存储单元 存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个结点的构成:元素 ( 数据元素 的映象) + 指针 (指示后继 ...

  9. Luogu P4592 [TJOI2018]异或 做题记录

    随机跳的. 树上维护序列,显然树剖.维护异或,显然 01trie. 01trie 维护区间异或,显然可持久化一下. 看到时限很大,显然可以双 log. 于是跑一边树剖,再根据 id 暴力建一个 可持久 ...

  10. CodeForces 1030E Vasya and Good Sequences 位运算 思维

    原题链接 题意 目前我们有一个长为n的序列,我们可以对其中的每一个数进行任意的二进制重排(改变其二进制表示结果的排列),问我们进行若干次操作后得到的序列,最多能有多少对 \(l, r\) 使得 \([ ...