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 }

 

posted @ 2014-08-21 20:26  yeahpeng  阅读(223)  评论(0编辑  收藏  举报