训练指南 乒乓
2016-10-10 20:23
169 查看
题目大意
给你一个长度为n的序列,如果i<j<k且ai < aj < ak,则(i,j,k)构成一个三元组,保证a各不相同,求问这样的三元组的个数
范围
t组数据(t<=20),3<=n<=20000,1<=ai<=100000
思路
用类似于求逆序对的方法来做,c[i]表示i之前比ai小的,d[i]表示i之后比ai大的
给你一个长度为n的序列,如果i<j<k且ai < aj < ak,则(i,j,k)构成一个三元组,保证a各不相同,求问这样的三元组的个数
范围
t组数据(t<=20),3<=n<=20000,1<=ai<=100000
思路
用类似于求逆序对的方法来做,c[i]表示i之前比ai小的,d[i]表示i之后比ai大的
// LA4329 Ping pong // Rujia Liu #include<cstdio> #include<vector> using namespace std; //inline int lowbit(int x) { return x&(x^(x-1)); } inline int lowbit(int x) { return x&-x; } struct FenwickTree { int n; vector<int> C; void resize(int n) { this->n = n; C.resize(n); } void clear() { fill(C.begin(), C.end(), 0); } // 计算A[1]+A[2]+...+A[x] (x<=n) int sum(int x) { int ret = 0; while(x > 0) { ret += C[x]; x -= lowbit(x); } return ret; } // A[x] += d (1<=x<=n) void add(int x, int d) { while(x <= n) { C[x] += d; x += lowbit(x); } } }; const int maxn = 20000 + 5; int n, a[maxn], c[maxn], d[maxn]; FenwickTree f; int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); int maxa = 0; for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); maxa = max(maxa, a[i]); } f.resize(maxa); f.clear(); for(int i = 1; i <= n; i++) { f.add(a[i], 1); c[i] = f.sum(a[i]-1); } f.clear(); for(int i = n; i >= 1; i--) { f.add(a[i], 1); d[i] = f.sum(a[i]-1); } long long ans = 0; for(int i = 1; i <= n; i++) ans += (long long)c[i]*(n-i-d[i]) + (long long)(i-c[i]-1)*d[i]; printf("%lld\n", ans); } return 0; }
相关文章推荐
- LA4329 乒乓比赛(树状数组)(训练指南)
- 训练指南-1.3-高效算法-LA2965侏罗纪-中途相遇法,子集枚举,映射⭐⭐⭐⭐⭐难度:3
- [训练指南]3.1.1.Examples UVA 11995 11991 1203 11997 1160 1329
- uva 11168 Airport(训练指南)
- 《算法竞赛-训练指南》第一章-1.7——UVa 11464
- 《算法竞赛-训练指南》第一章-1.28_UVa 10891
- Topcoder Arena插件配置和训练指南
- 训练指南DP例题读后感
- 关于训练指南的第一章总结
- 《算法竞赛-训练指南》第一章-1.23_LA 3695
- 《算法竞赛-训练指南》第一章-1.26_LA 3882
- 凸包代码,摘自入门经典训练指南
- 《算法竞赛-训练指南》第三章-3.7_LA 3429(树状数组)
- 入门经典训练指南第三章例题1.UVa 11995 I Can Guess the Data Structure!
- 算法竞赛入门经典训练指南第四章几何专题答案
- ACM入门训练指南
- 算法竞赛入门经典训练指南 例题1-19 计算器谜题 Calculator Conundrum uva11549
- 训练指南---总结
- 新手模拟器训练指南(固定翼版)
- 训练指南——数学专题一的总结