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]); } }