题解 CF1268C 【K Integers】
然而似乎另一篇题解是两只
发现似乎最终
于是就得到一个
那么显然这东西只需要求一个中位数即可。而
LL ans1, ans2 ;
int N, base[MAXN], pos[MAXN] ;
struct BIT{
LL _bit[MAXN] ;
void ins(int x, int v){
for ( ; x <= N ; x += (x & -x)) _bit[x] += v ;
}
LL ask(int x){
LL res = 0 ;
for ( ; x ; x -= (x & -x)) res += _bit[x] ;
return res ;
}
int find_k(int k){
int res = 0 ;
for (int j = 20 ; j >= 0 ; -- j)
if ((res | 1 << j) <= N)
if (_bit[res | (1 << j)] <= k)
res |= (1 << j), k -= _bit[res] ;
return res ;
}
}A, B ;
int main(){
cin >> N ; int i, j ;
for (int i = 1 ; i <= N ; ++ i)
scanf("%d", &base[i]), pos[base[i]] = i ;
for (int i = 1 ; i <= N ; ++ i){
A.ins(pos[i], 1), B.ins(pos[i], pos[i]) ;
ans1 += i - A.ask(pos[i]), j = A.find_k(i / 2) + 1 ;
int median1 = i >> 1, median2 = i - 1 - median1 ;
ans2 = 1ll * median1 * j - B.ask(j - 1) - (1ll * median1 * (median1 + 1) >> 1) ;
ans2 += B.ask(N) - B.ask(j) - 1ll * median2 * j - (1ll * median2 * (median2 + 1) >> 1) ;
printf("%lld\n", ans1 + ans2), ans2 = 0 ;
}
}