遗尿的广大

题意:给出数组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