MSBOP 2015 Round3 register

Ended

Participants:978

Verdict:AC | TLE
Submitted:2015-05-09 16:22:59

Lang:G++

Edit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 200100
int a[N];
int s[40][N];//
int num[40][N];//num[i][j] - num[i][j-1] == 1ij
void build(int l, int r, int dep = 1)
{
    if(l == r){
        s[dep][l] = s[dep-1][l];
        return;
    }
    int mid = l+r>>1;
    int cnt = mid-l+1;
    for(int i = l; i <= r; i++) if(s[dep-1][i] < a[mid]) cnt--;
    int c1 = l, c2 = mid+1;
    for(int i = l; i <= r; i++)
    {
        if(s[dep-1][i] < a[mid] || ( s[dep-1][i] == a[mid] && cnt-- > 0)) s[dep][c1++] = s[dep-1][i];
        else s[dep][c2++] = s[dep-1][i];
        num[dep-1][i] = num[dep-1][l-1]+c1-l;
    }
    build(l, mid, dep+1);
    build(mid+1, r, dep+1);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX