PAT-T1010 Lehmer Code(分块解法)

 

 

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+100;
int a[maxn];
int c[maxn];//表示分块数组里每个点的信息 
int mk[maxn];//用于标记值在每个块内的数的个数
int l[maxn];//记录每个块的起点
int r[maxn];//记录每个块的终点
int pos[maxn];//标记该点在哪个块内 
int r1[maxn];//标记每个元素右边比自己小的个数 
int main () {
    int N;
    scanf("%d",&N);
    for (int i=1;i<=N;i++)
        scanf("%d",&a[i]),a[i]+=10010;
    
    int t=sqrt(maxn);
    for (int i=1;i<=t;i++) {
        l[i]=(i-1)*t+1;
        r[i]=i*t;
    }
    if (r[t]<maxn) t++,l[t]=r[t-1]+1,r[t]=N;
    for (int i=1;i<=t;i++) {
        for (int j=l[i];j<=r[i];j++) {
            pos[j]=i;
        }
    } 
    for (int i=N;i>=1;i--) {
        c[a[i]]++;
        mk[pos[a[i]]]++;
        for (int j=a[i]-1;j>=l[pos[a[i]]];j--)
             r1[i]+=c[j];
        for (int j=pos[a[i]]-1;j>=1;j--) 
            r1[i]+=mk[j];
    }
    for (int i=1;i<=N;i++) {
        if (i!=1) printf(" ");
        printf("%d",r1[i]);
    }
} 

 

posted @ 2020-04-06 14:39  zlc0405  阅读(217)  评论(0编辑  收藏  举报