遗尿的普遍

题意:给出数组A,定义f(l,r,x)为A[]的下标l到r之间,等于x的元素数。i和j符合f(1,i,a[i])>f(j,n,a[统计,j]),求有多少对如此的(i,j).

http://blog.sina.com.cn/s/blog_473788260100snzb.html

解法:分别从左到右,由右到左预处理到某个下标甘休有多少个数等于该下标,用map维护。

 

下一场树状数组更新每个f(j,n,a[j]),预处理完毕,接下去,从左往右扫过去,每一遍从树状数组中删去a[i],因为i
!= j,i不可能用作后边的总结,然后统计getsum(inc[a[i]]-1),

  现实中相遇过许多因为孩子尿床而寻医问药的爹娘,据说当地小孩子医院一位中医专家就专用针灸治疗小儿尿床。根据中医理论,小儿尿床是肾那几个脏器有难题,和习以为常中医理论一样,任何疾病,不管是还是不是真毛病,都能得出人体至少五分之一脏器出了难点的定论。正好西部某位卫生市长也是偏方治疗尿床的拥护者,用的方子恐怕某些真正的中医现在都糟糕意思用了,居然是给患儿喝用尿床尿湿的手纸烧成的灰泡的水。就像是这几个题材是个沉痛的清洁难点,都惊动了卫生参谋长这一级官员了。但是我自己用不到不行钟检索资料查到的结果,劳县长大驾如同是惊奇了。
  尿床的主要原因,第二位的是生长难点,也是绝半数以上孩童尿床的案由。究竟小孩多大才应该不尿床,家长和业内医生的见地歧异很大。一项问卷琢磨发现,一般家长觉得小孩两岁多就活该不尿床了,但医务卫生人员一般认为要到五岁多。那很不难精晓,因为老人们一连期望儿女的生长处于前列。看到旁人家的男女两岁多就不尿床了,就认为自己的子女至少不比别人差,倘使三岁多还尿床就揪心发育迟滞。倘使协调的孩子三岁多才不尿床,那么家长一般会以为四岁多才不尿床的子女逊于本人孩子。家长教育的拔苗助长心思,古今中外都有。一般总结认为,男孩子最晚到七岁,女孩最晚到六岁甘休尿床。在那几个岁数之内,因为尿床被老人带着看医务卫生人员,吃药,甚至挨针扎的孩子,实在是太冤枉了。
  更主要的一些,尿床时间延长,本身并未多少有害,有很多办法可以缓解,带尿裤,定时叫醒排尿。风险最大的根源于对思想自尊的祸害,而竭尽全力要把男女这“病”治好的养父母,和尿床这么些疾病是同一个主旋律的。
  尿床可能是少数疾病的变现,但这一个病症往往都伴随有任何症状,比如尿路感染,除了尿床之外还有尿频、尿急、尿痛。大多是在曾经学会控制排尿一段时间后又起来尿床,经过医务卫生人员的咨询和自我批评大多可以消除,况且爆发率很低。
  所以假诺子女从小就尿床,不要过度紧张,也不用去医院,更不要治疗。但是一旦已经学会了很好的操纵夜尿一段时间,又起来现出夜尿,则要摸索一下缘故。

(inc表示从左到右),即查询比此时的a[i]小的f(j,n,a[j])个数。

 

代码:

统计 1统计 2

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <map>
#define lll __int64
using namespace std;
using namespace __gnu_cxx;
#define N 1000007
#define M 22

int c[N],a[N];
map<int,int> inc,des;
int n;

int lowbit(int x)
{
    return x & (-x);
}

void modify(int x,int val)
{
    while(x <= n)
    {
        c[x] += val;
        x += lowbit(x);
    }
}

int getsum(int x)
{
    int res = 0;
    while(x > 0)
    {
        res += c[x];
        x -= lowbit(x);
    }
    return res;
}

int main()
{
    int i;
    inc.clear();
    des.clear();
    memset(c,0,sizeof(c));
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(i=n;i>=1;i--)
    {
        des[a[i]]++;
        modify(des[a[i]],1);
    }
    lll ans = 0;
    for(i=1;i<=n;i++)
    {
        inc[a[i]]++;
        modify(des[a[i]],-1);
        des[a[i]]--;
        ans += getsum(inc[a[i]]-1);
    }
    printf("%I64d\n",ans);
    return 0;
}

View Code