'commit'
This commit is contained in:
46
TangDou/AcWing/BIT/241_BIT.cpp
Normal file
46
TangDou/AcWing/BIT/241_BIT.cpp
Normal file
@@ -0,0 +1,46 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
|
||||
typedef long long LL;
|
||||
const int N = 200010;
|
||||
|
||||
int n, a[N]; // n个元素,a[i]代表原始值
|
||||
LL big[N], small[N]; // big[i]:比a[i]大的元素个数,small[i]:比a[i]小的元素个数
|
||||
LL res1, res2; // V的个数,∧的个数
|
||||
|
||||
// 树状数组模板
|
||||
typedef long long LL;
|
||||
#define lowbit(x) (x & -x)
|
||||
int c[N];
|
||||
void add(int x, int d) {
|
||||
for (int i = x; i < N; i += lowbit(i)) c[i] += d;
|
||||
}
|
||||
LL sum(int x) {
|
||||
LL res = 0;
|
||||
for (int i = x; i; i -= lowbit(i)) res += c[i];
|
||||
return res;
|
||||
}
|
||||
|
||||
// 桶计数+前缀和
|
||||
int main() {
|
||||
scanf("%d", &n);
|
||||
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
|
||||
|
||||
for (int i = 1; i <= n; i++) { // 枚举每个点,由左到右一个个下场
|
||||
int x = a[i];
|
||||
small[i] = sum(x - 1); // 在我前面出场,并且,值比我小, 用于方便统计铁锹(∧)
|
||||
big[i] = sum(n) - sum(x - 1); // 在我前面出场,并且,值比我大, 用于方便统计尖刀(V)
|
||||
add(x, 1); // 以值为桶的标识,记录此桶中数量+1
|
||||
}
|
||||
|
||||
memset(c, 0, sizeof c);
|
||||
|
||||
for (int i = n; i; i--) {
|
||||
int x = a[i];
|
||||
res1 += small[i] * sum(x - 1);
|
||||
res2 += big[i] * (sum(n) - sum(x - 1));
|
||||
add(x, 1);
|
||||
}
|
||||
printf("%lld %lld\n", res2, res1);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user