uvalive 4329(BIT)

来源:互联网 发布:java卸载不了怎么办 编辑:程序博客网 时间:2024/05/21 05:21

题意:一条街上有n个运动员,平时会一起切磋,要求有三个人,住在中间的才可以当裁判,n个人都有对应的技能值,裁判的技能值要比一个人大比一个人小。按住所给出n个人的技能值,问有多少种切磋方式。

题解:如果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[N], l[N], r[N];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;}


0 0
原创粉丝点击