老爺口諭,有n個數-10^9<=n<=10^9,每個數的範圍在[0,10^5],給定m個詢問,每次詢問區間[l,r]的第k小值
可持久化線段樹,舔的老爺的模板
1 #include2 #include3view codeusing
namespace
std;
4#define maxn 100005
5int
val[maxn],hash[maxn],hh;
6int tree[maxn*20],root[maxn*20],rson[maxn*20],lson[maxn*20
],tot;
7void build(int x,int &y,int l,int r,int
v)15
else19}
20int query(int x,int y,int l,int r,int
k)26
intmain()
34 sort(hash+1,hash+hh+1
);35 hh=unique(hash+1,hash+hh+1)-(hash+1
);36
for(int i=1;i<=n;i++)
40for(int i=1;i<=m;i++)
44return0;
45 }
lca+可持久化線段樹,yooo~
1 #include2 #include3view codeusing
namespace
std;45
#define maxn 100005
6int cnt,v[maxn<<1],next[maxn<<1
],first[maxn];
7int dep[maxn],f[maxn][25
],val[maxn],hash[maxn],hh;
8int tree[maxn*20],root[maxn],lson[maxn*20],rson[maxn*20
],tot;910
void add(int st,int
end)
15void build(int x,int &y,int l,int r,int
v)23
else27}
28void dfs(int
x)36}37
}38int query(int a,int b,int c,int d,int l,int r,int
k)44
int lca(int a,int
b)57
intmain()
65 sort(hash+1,hash+1+hh);
66 hh=unique(hash+1,hash+1+hh)-(hash+1
);67
for(int i=1;i<=n;i++)
68 val[i]=lower_bound(hash+1,hash+1+hh,val[i])-hash;
69for(int i=1;i)
73 dfs(1
);74
for(int j=1;(1
75for(int i=1;i<=n;i++)
76 f[i][j]=f[f[i][j-1]][j-1
];77
for(int i=1;i<=m;i++)
85return0;
86 }
可持久化線段樹 Step 1 靜態區間第K大
考慮這樣乙個問題 給出一段長度為n序列 對於一些詢問 請輸出序列上 l r 內第k大的數。關於暴力做法,其實是很簡單的,但是會超時,在此略過。有一種辦法,是利用字首和的思想。先將 離散到區間 1 n 然後,對於任意節點 i 都建立一棵權值線段樹,代表離散後 在權值區間 1 n 出現的次數。這樣,對於...
可持久化線段樹總結(可持久化線段樹,線段樹)
最近正在學習一種資料結構 可持久化線段樹。看了網上的許多部落格,弄了幾道模板題,思路有點亂了,所以還是來總結整理下吧。你需要維護這樣的乙個長度為 n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一...
可持久化線段樹
可持久化線段樹,意思是可以查詢歷史記錄的線段樹。又叫主席樹。我們可以通過記錄不同的根節點,並在每乙個更新到的節點處新建必要的節點。詢問不同版本的主席樹,只需要進入不同的根節點即可。例題 給定n,m,輸入n個數組成的數列,有m個詢問,每次詢問l,r這個區間中,第k小的數的值。分析 這個題可以巧妙運用主...