UVa-1428 - Ping pong
来源:互联网 发布:淘宝信誉在哪里看 编辑:程序博客网 时间:2024/05/16 19:08
题目大意:
已知一个数列a1,...,an问,有多少种形如ai <= aj <= ak 或 ai >= aj >= ak 的组合。
分析:
首先枚举 j,当 j确定时,ai <= aj <= ak的组合数为c[j] * d_[j];ai >= aj >= ak的组合数为c_[j] * d[j]
其中
c[j]代表在 j 的左边且比 aj 小的数,c_[j]代表在 j 的左边且比 aj 大的数。易知,c[j] + c_[j] = j - 1
d[j]代表在 j 的右边且比 aj 小的数,d_[j]代表在 j 的右边且比 aj 大的数。易知,d[j] + d_[j] = n - 1 - j(其中,i 从0开始)
所以,总的组合数为sigma(c[i] * d_[j] + c_[i] * d[j]) j = 0 ~ n - 1
而c[j]和d[j]均可以用树状数组预处理。每次更改时,包含 aj 的数++。
因此,时间复杂度为 O(n log max_),max_ = max( aj ) j = 0 ~ n - 1
程序:
#include <iostream>#include <cstdio>#include <cstdlib>#include <vector>#include <memory.h>using namespace std;#define LL long longconst int Max_N = 20010;const int Max_A = 100010;int score[Max_N];int n_can;struct Bit{ int n; int x[Max_A]; void Init(int delta) { n = delta + 1; memset(x, 0, sizeof(x)); } int Low_Bit(int delta) { return delta & (-delta); } void Add(int delta) { while(delta <= n) { x[delta] ++; delta += Low_Bit(delta); } } int Sum(int delta) { int ret = 0; while(delta > 0) { ret += x[delta]; delta -= Low_Bit(delta); } return ret; }};Bit B;LL c[Max_N], c_[Max_N], d[Max_N], d_[Max_N];void Init(){ scanf("%d", &n_can); int max_ = 0; for(int i = 0; i < n_can; i ++) { scanf("%d", &score[i]); max_ = max(max_, score[i]); } B.Init(max_); for(int i = 0; i < n_can; i ++) { c[i] = B.Sum(score[i]); c_[i] = i - c[i]; B.Add(score[i]); } B.Init(max_); for(int i = n_can - 1; i >= 0; i --) { d[i] = B.Sum(score[i]); d_[i] = n_can - 1 - i - d[i]; B.Add(score[i]); }}void Solve(){ LL ans = 0; for(int i = 0; i < n_can; i ++) ans += c[i] * d_[i] + c_[i] * d[i]; printf("%lld\n", ans);}int main(){ int test; scanf("%d", &test); for(int i = 0; i < test; i ++) { Init(); Solve(); } return 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(树状数组)
- 【uva】1428 - Ping pong(树状数组)
- uva 1428 - Ping pong(树状数组)
- uva 1428 Ping pong (树状数组)
- UVa 1428 Ping pong (树状数组)
- UVA 1428 Ping Pong(树状数组)
- Ping pong UVA
- uva 1428 - Ping pong(树状数组,4级)
- uva 1428 - Ping pong (树状数组的应用)
- 树状数组(二叉索引树)(uva 1428 - Ping pong )
- nand flash学习笔记一
- 最大值最小问题
- 人脸识别图像库
- JS 对象机制深剖——Object.prototype 是谁?
- HDOJ-2258 Continuous Same Game (1) dfs
- UVa-1428 - Ping pong
- 知名大学硕博论文及英文期刊全文资源集合
- 如何将rdba转换成数据文件的地址
- Populating Next Right Pointers in Each Node
- 一个简单的GLSL Shader例子
- 一些有用的sql语句
- nginx负载均衡和lvs负载均衡的比较分析
- 面向对象编程:继承
- 崛起中的九大HTML5开发工具