zoukankan      html  css  js  c++  java
  • 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 == '
    ');
    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 }
  • 相关阅读:
    [博客美化]给你博客添加一个萌萌的看板娘吧
    精简Command版SqlHelper
    使用VS2017创建EF框架实例
    Ueditor1.4.3.3 asp UTF-8版文件缺失修改方法
    android studio编译包真机安装失败解决方案记录
    ANDROID开发之问题积累及解决方案(四)
    ANDROID开发之问题积累及解决方案(三)
    ANDROID调用webservice带soapheader验证
    ANDROID开发之问题积累及解决方案(二)
    ANDROID开发之问题积累及解决方案(一)
  • 原文地址:https://www.cnblogs.com/yeahpeng/p/3927997.html
Copyright © 2011-2022 走看看