Pashmak and Parmida's problem(树状数组)
题目链接:http://codeforces.com/contest/459/problem/D
题意: 数列A, ai表示 i-th 的值, f(i,j, x) 表示【i,j】之间x的数目, 问:当 1 <= i < j <= n, 满足 f(1, i, ai) < f(j,n, aj)的对数。
题解:分别求出两组数列 Ii = f(1, i, ai)(1<=i <= n) Jj = f(j,n, aj)(1 <= j <= n), 然后, 从n开始, 在数列 Ij(i < j <= n)中求出 小于 Ii的个数和。
1 /***Good Luck***/ 2 #define _CRT_SECURE_NO_WARNINGS 3 #include <iostream> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cstring> 7 #include <string> 8 #include <algorithm> 9 #include <stack> 10 #include <map> 11 #include <queue> 12 #include <vector> 13 #include <set> 14 #include <functional> 15 #include <cmath> 16 17 #define Zero(a) memset(a, 0, sizeof(a)) 18 #define Neg(a) memset(a, -1, sizeof(a)) 19 #define All(a) a.begin(), a.end() 20 #define PB push_back 21 #define inf 0x3f3f3f3f 22 #define inf2 0x7fffffffffffffff 23 #define ll long long 24 using namespace std; 25 //#pragma comment(linker, "/STACK:102400000,102400000") 26 void get_val(int &a) { 27 int value = 0, s = 1; 28 char c; 29 while ((c = getchar()) == ' ' || c == '\n'); 30 if (c == '-') s = -s; else value = c - 48; 31 while ((c = getchar()) >= '0' && c <= '9') 32 value = value * 10 + c - 48; 33 a = s * value; 34 } 35 const int maxn = 1000010; 36 int arri[maxn], arrj[maxn]; 37 int arr2[maxn]; 38 int arr1[maxn]; 39 int A[maxn]; 40 int n; 41 int lowbit(int x) { 42 return x & (-x); 43 } 44 45 int sum(int i) { 46 int ret = 0; 47 while (i > 0) { 48 ret += A[i]; 49 i -= lowbit(i); 50 } 51 return ret; 52 } 53 54 void update(int pos, int val) { 55 while (pos <= n) { 56 A[pos] += val; 57 pos += lowbit(pos); 58 } 59 } 60 61 int main() { 62 //freopen("data.out", "w", stdout); 63 //freopen("data.in", "r", stdin); 64 //cin.sync_with_stdio(false); 65 66 scanf("%d", &n); 67 for (int i = 1; i <= n; ++i) { 68 scanf("%d", arr1 + i); 69 arr2[i] = arr1[i]; 70 } 71 72 sort(arr2, arr2 + n + 1); // 离散化 73 int len = unique(arr2, arr2 + n) - arr2; 74 for (int i = 1; i <= n; ++i) { 75 arr1[i] = lower_bound(arr2, arr2 + len, arr1[i]) - arr2; 76 } 77 Zero(arr2); 78 for (int i = 1; i <= n; ++i) { 79 arri[i] = ++arr2[arr1[i]]; 80 81 } 82 Zero(arr2); 83 for (int i = n ; i > 0; --i) { 84 arrj[i] = ++arr2[arr1[i]]; 85 } 86 ll count = 0; 87 for (int i = n; i >= 1; --i) { 88 89 count += sum(arri[i] - 1) ; 90 update(arrj[i], 1); 91 } 92 cout << count << endl; 93 return 0; 94 }