SPOJ DQUERY (主席樹求區間不同數個數)

2022-08-05 17:36:13 字數 850 閱讀 6510

題意:找n個數中無修改的區間不同數個數

我們需要這麼想:從左向右新增一到主席樹上,新增的是該數字處在的位置

但是如果該數字前面出現過,就在此版本的主席樹上的前面出現的位置減一,接著才在此位置上添一

這樣查詢是按照右區間版本的主席樹來找(lef,rig)的數字

因為要將此區間每個不同的數都處在最後出現的位置

/*

如果此數之前出現過就先減去,接著再加,最後在區間(l,r)中找到root[r]這個歷史版本

*/#include

#include

#include

#include

using

namespace

std;

#define dir(a,b) (a>>b)

const

int max=30010

;int

root[max],tot,val[max];

struct

node

msegtr[max*40

];map

mp;void

init()

void create(int sta,int enn,int &x,int y,int pos,int

aad)

int query(int sta,int enn,int x,int y)//

只有左邊有界限

intmain()

else

mp[val[i]]=i;

}scanf("%d

",&m);

for(int i=0;ii)

}return0;

}