uvalive 4329(BIT)
2015-04-04 00:17
162 查看
题意:一条街上有n个运动员,平时会一起切磋,要求有三个人,住在中间的才可以当裁判,n个人都有对应的技能值,裁判的技能值要比一个人大比一个人小。按住所给出n个人的技能值,问有多少种切磋方式。
题解:如果i当裁判,i左边的比他小的有ai个,右边比他小的有bi个,那么对于i有ai*(n - i - bi) + bi*(i - 1 - ai),然后代入了BIT二叉索引树的思想来解答。
题解:如果i当裁判,i左边的比他小的有ai个,右边比他小的有bi个,那么对于i有ai*(n - i - bi) + bi*(i - 1 - ai),然后代入了BIT二叉索引树的思想来解答。
#include <stdio.h> #include <string.h> const int M = 20005; const int N = 100005; int n, a[M], s , l , r ; int lowbit(int x) { return x & (-x); } int sum(int x) { int res = 0; while (x > 0) { res += s[x]; x -= lowbit(x); } return res; } void add(int x, int d) { while (x <= N) { s[x] += d; x += lowbit(x); } } int main() { int t; scanf("%d", &t); while (t--) { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); memset(s, 0, sizeof(s)); for (int i = 1; i <= n; i++) { l[i] = sum(a[i]);//i左边比a[i]小的数字有几个 add(a[i], 1); } memset(s, 0, sizeof(s)); for (int i = n; i >= 1; i--) { r[i] = sum(a[i]);//i右边比a[i]小的数字有几个 add(a[i], 1); } long long res = 0; for (int i = 1; i <= n; i++) { res += l[i] * (n - i - r[i]); res += (i - 1 - l[i]) * r[i]; } printf("%lld\n", res); } return 0; }
相关文章推荐
- UVALive 4329 Ping pong (BIT)
- UVALive 4329 Ping pong(线段树)
- uvalive 4329 Ping Pong(树状数组)
- Uvalive 6832 Bit String Reordering
- UVALive - 4329 Ping pong 树状数组
- UVALive - 6832 Bit String Reordering (找规律)
- 【暑假】[实用数据结构]UVAlive 4329 Ping pong
- UVALive - 4329 Ping pong (树状数组)
- LA 4329/uvalive 4329 (树状数组)
- [UVALive3675]Sorted bit sequence && 数位DP
- UVALive 4329 Ping pong(树状数组求逆序数+顺序数)
- UVALive 6832 Bit String Reordering
- UVALive 4329 Ping pong
- UVALive - 4329 树状数组
- Bit String Reordering UVALive - 6832
- UVALive - 4329 Ping pong 数状数组
- UVALive 4329 Ping pong
- UVALIVE 4329 Ping pong(树状数组)
- UVALive 4329 Ping pong(解法二:树状数组)
- UVALive-4329 Ping pong (树状数组)