aboutsummaryrefslogtreecommitdiff
path: root/works/solutions/acwing/1215.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-02-12 15:55:21 +0800
committerYuqian Yang <crupest@crupest.life>2025-02-12 16:04:50 +0800
commit77e6cdc863d2cbd9df578a665804daf28d8593fe (patch)
tree62c9f3e071d8d1d6fe125fe801907db11784332e /works/solutions/acwing/1215.cpp
parent10eb95869601e145b1d8bc909424777c25752d51 (diff)
parenta557fa36a22c5ef4a29da596ee1e3aa10be55984 (diff)
downloadcrupest-77e6cdc863d2cbd9df578a665804daf28d8593fe.tar.gz
crupest-77e6cdc863d2cbd9df578a665804daf28d8593fe.tar.bz2
crupest-77e6cdc863d2cbd9df578a665804daf28d8593fe.zip
import(solutions): IMPORT crupest/solutions COMPLETE.
Diffstat (limited to 'works/solutions/acwing/1215.cpp')
-rw-r--r--works/solutions/acwing/1215.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/works/solutions/acwing/1215.cpp b/works/solutions/acwing/1215.cpp
new file mode 100644
index 0000000..d6832b3
--- /dev/null
+++ b/works/solutions/acwing/1215.cpp
@@ -0,0 +1,59 @@
+#include <cstring>
+#include <iostream>
+
+const int MAX = 1000010; // Why 1000001 is not ok!?
+
+int n;
+int H[100001];
+int bit[MAX];
+int reverse_pairs[100001];
+
+int lowbit(int x) { return x & -x; }
+
+void add(int x, int y) {
+ for (int i = x; i < MAX; i += lowbit(i)) {
+ bit[i] += y;
+ }
+}
+
+int query(int x) {
+ int result = 0;
+ for (int i = x; i != 0; i -= lowbit(i)) {
+ result += bit[i];
+ }
+ return result;
+}
+
+int main() {
+ std::ios_base::sync_with_stdio(false);
+ std::cin.tie(nullptr);
+
+ std::cin >> n;
+
+ for (int i = 1; i <= n; i++) {
+ std::cin >> H[i];
+ H[i]++;
+ }
+
+ for (int i = 1; i <= n; i++) {
+ add(H[i], 1);
+ reverse_pairs[i] = i - query(H[i]);
+ }
+
+ std::memset(bit, 0, sizeof bit);
+
+ for (int i = n; i >= 1; i--) {
+ add(H[i], 1);
+ reverse_pairs[i] += query(H[i] - 1);
+ }
+
+ long long result = 0;
+
+ for (int i = 1; i <= n; i++) {
+ result += (1LL + reverse_pairs[i]) * reverse_pairs[i] / 2;
+ }
+
+ std::cout << result;
+
+ return 0;
+}