UVa 1428 Ping pong (树状数组)
来源:互联网 发布:淘宝卖家登录界面 编辑:程序博客网 时间:2024/06/05 11:17
题目链接:http://acm.hust.edu.cn/vjudge/problem/36244
题目大意:给出n个不同的数,从左到右按顺序选出三个a1,a2,a3,使得a1>a2&&a2<a3 || a1<a2&&a2>a3,问有多少种选法。
思路:本题的关键在于,对于任意一个数,怎样快速求出它的两边各有多少个数比它大(小)。我们以左边为例,假设当前的数为a[i],那么它的左边比它小的数的个数即为1,2,3......a[i]-1这几个数字各自的个数之和,这正好可以用到树状数组的区间求和性质。我们从左到右扫描所有a[i], 设num[i]为扫到a[i]时数字i的个数,那么比a[i]小的数字的个数即为num[1]~num[a[i]-1]之和。每次扫描到一个a[i]时,都要将num[a[i]]加1,这不就是动态修改单元素的值吗,树状数组搞定。
另c[i]为在a[i]左边并且小于它的数的个数,那么i-a[i]即为在其左边并且大于它的数;同理,设d[i]为在a[i]右边并且小于它的数的个数,那么大于它的就是n-i-d[i]。根据乘法原理及加法原理,累加即可。
#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<iostream>using namespace std;const int maxn = 100000 + 5;typedef long long ll;int mx;int a[maxn], c[maxn], d[maxn], num[maxn];int lowbit(int x){ return x & -x;}void add(int x, int m){ while(x <= mx) { num[x] += m; x += lowbit(x); }}int sum(int x){ int ret = 0; while(x > 0) { ret += num[x]; x -= lowbit(x); } return ret;}int main(){ int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for (int i = 1; i <= n; i++) { scanf("%d",&a[i]); mx = max(mx,a[i]); } memset(num, 0, sizeof num); for (int i = 1; i <= n; i++) { add(a[i],1); c[i] = sum(a[i]-1); } memset(num, 0, sizeof num); for (int i = n; i >= 1; i--) { add(a[i],1); d[i] = sum(a[i]-1); } ll sum = 0; for (int i = 1; i <= n; i++) sum += (ll)(i-1-c[i])*d[i] + (ll)(n-i-d[i])*c[i]; printf("%lld\n",sum); }}
0 0
- 【uva】1428 - Ping pong(树状数组)
- uva 1428 Ping pong (树状数组)
- UVa 1428 Ping pong (树状数组)
- uva 1428 - Ping pong(树状数组)
- UVa:1428 Ping pong (树状数组)
- UVA 1428 - Ping pong(树状数组)
- uva 1428 - Ping pong(树状数组)
- UVA 1428 Ping Pong(树状数组)
- uva 1428 - Ping pong(树状数组,4级)
- uva 1428 - Ping pong (树状数组的应用)
- 树状数组(二叉索引树)(uva 1428 - Ping pong )
- Ping pong(树状数组)
- Uva 1428 Ping pong (树状数组,Fenwick树)
- Ping pong(树状数组)
- hdu 2492 Ping pong(树状数组)
- UVALive - 4329 Ping pong (树状数组)
- Poj 3928 Ping pong(树状数组)
- UVALIVE 4329 Ping pong(树状数组)
- mysql Show global status参数详解
- 最长回文子串
- 1022. Digital Library (30)-PAT甲级真题(map映射)
- HDU 5860 Death Sequence (递推 + 约瑟夫环 + 思维)——2016 Multi-University Training Contest 10
- Spring从入门到精通(一)----IoC(控制反转)
- UVa 1428 Ping pong (树状数组)
- PerconaXtrabackup 压缩备份集
- iptables学习
- SpringIOC--初始化源码解析
- HDOJ 2066 一个人的旅行(最短路)
- 求两个二进制数的最大公约数
- 初窥 CATransform3D 文档解读
- 计算机网络问题总结
- itoo在线编辑学习——nignx