划分树模板
Posted pb2016
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了划分树模板相关的知识,希望对你有一定的参考价值。
1 ///划分树模板,找区间第k小的数 2 const int mx=1e5+5; 3 int tree[30][mx]; 4 int sortt[mx]; 5 int sum[30][mx]; 6 7 void build(int l,int r,int c) 8 { 9 if (l==r) return ; 10 int m=(l+r)>>1; 11 int isame=m-l+1; 12 int pl=l,pr=m+1; 13 for (int i=l;i<m;i++) 14 if (tree[c][i]<sortt[m]) isame--; 15 for (int i=l;i<=r;i++){ 16 if (i==l) sum[c][i]=0; 17 else sum[c][i]=sum[c][i-1]; 18 if (tree[c][i]<sortt[m]){ 19 tree[c+1][pl++]=tree[c][i]; 20 sum[c][i]++; 21 } 22 else if ( tree[c][i]==sortt[m]&&isame){ 23 isame--; 24 tree[c+1][pl++]=tree[c][i]; 25 sum[c][i]++; 26 } 27 else tree[c+1][pr++]=tree[c][i]; 28 } 29 build(l,m,c+1); 30 build(m+1,r,c+1); 31 } 32 33 int query(int L,int R,int l,int r,int c,int k){ 34 if (L==R) return tree[c][L]; 35 int s,ss; 36 if (l==L){ 37 s=0; 38 ss=sum[c][r]; 39 } 40 else{ 41 s=sum[c][l-1]; 42 ss=sum[c][r]-s; 43 } 44 int m=(L+R)>>1; 45 if (k<=ss) return query(L,m,L+s,L+s+ss-1,c+1,k); 46 return query(m+1,R,m+1+l-L-s,m+1+r-L-s-ss,c+1,k-ss); 47 }
以上是关于划分树模板的主要内容,如果未能解决你的问题,请参考以下文章
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试