선분 트 리 역순 수 구하 기 (단일 업데이트)

1488 단어 데이터 구조
제목: HDU 1394 최소 투자 번호
 
abcde... 의 역순 수가 k 라면 bcde... a 의 역순 수 는 얼마 입 니까?우 리 는 abcde... a 보다 작은 개 수 는 t 라 고 가정 합 니 다. 그러면 a 보다 큰 개 수 는 n - t - 1 입 니 다. a 를 가장 오른쪽 으로 이동 할 때 원래 a 보다 많 습 니 다.
큰 것 은 현재 모두 a 의 역순 이 되 었 다. 즉, 역순 수가 n - t - 1 증가 하 는 것 이다. 그러나 원래 a 보다 작은 역순 대 를 구성 하 는 수 는 지금 은 모두 순서 가 되 었 기 때문에 역순 대 는 t 를 감소 하기 때문에 새로운 서열 의 역순 수 는 k + = 이다.
n - t - t - 1, 즉 k + = n - 1 - 2 * t, 그래서 우 리 는 계속 자 리 를 옮 긴 다음 에 최소 값 을 업데이트 하면 됩 니 다.
#include 
#define maxn 55555

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

int sum[maxn<<2];
int x[maxn];

int min(int a,int b)
{
    return a>1;
    Build(lson);
    Build(rson);
}

void Update(int p,int l,int r,int rt)
{
    if(l==r)
    {
        sum[rt]++;
        return;
    }
    int m=(l+r)>>1;
    if(p<=m)
        Update(p,lson);
    else
        Update(p,rson);
    PushUP(rt);
}

int Query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&R>=r)
        return sum[rt];
    int m=(l+r)>>1;
    int ret=0;
    if(L<=m)      ret+=Query(L,R,lson);
    if(R>m)       ret+=Query(L,R,rson);
    return ret;
}

int main()
{
    int n,i;
    while(~scanf("%d",&n))
    {
        Build(0,n-1,1);
        int sum=0;
        for(i=0;i

좋은 웹페이지 즐겨찾기