靜態區間第k大數

2021-06-21 21:44:41 字數 1683 閱讀 6915

劃分樹版本:

#include#include#include#include#define maxn 100002

#define mlog 19

using namespace std;

int tree[mlog][maxn],cntleft[mlog][maxn],sorted[maxn];

void buildtree(int lef,int rig,int deep)

else

}buildtree(lef,mid,deep+1);

buildtree(mid+1,rig,deep+1);

}int query(int lef,int rig,int qlef,int qrig,int deep,int k)

else

}return tree[deep][qlef];

}int nextint()

int ans=ch-'0';

while(ch=getchar())

if(flag==1)

ans=-ans;

return ans;

}//注意初始化cntleft,排序sorted,buildtree(1,n,0)

int main()

sort(sorted+1,sorted+n+1);

buildtree(1,n,0);

int a,b,c;

for(int i=0;i

#include#include#includeusing namespace std;

const int n=100010;

const int deep=20;

int seq[deep][n]; //歸併樹

int a[n], n, m;

struct node

tree[n*4]; //線段樹

//線段樹+歸併樹一起建了,實際上二者的過程一樣。。

void build(int l, int r, int p, int deep)

build(l, tree[p].mid, p*2, deep+1);

build(tree[p].mid+1, r, p*2+1, deep+1);

//歸併過程

int i, j, k;

for(i=l, j=tree[p].mid+1, k=l; i<=tree[p].mid && j<=r; )

while(i<=tree[p].mid)

seq[deep][k++] = seq[deep+1][i++];

while(j<=r)

seq[deep][k++] = seq[deep+1][j++];

}//通過二分列舉,返回key在本區間大於多少個數

//注意:任何乙個通過線段樹最終到達的區間一定是已經排好序了的,所以可以通過二分求

int counthelp(int l, int r, int p, int key, int deep)

}//返回在通過二分列舉後得到的結果。。。

int query(int ll, int rr, int cnt)

return seq[1][l-1];

}int main()

} return 0;

}

塊鏈神馬的以後填坑。。。

可持久化線段樹什麼的以後填坑。。。

靜態區間 kth 第 k 小數

給定乙個長度為 n 的整數序列,下標為 1 sim n m 個操作,每次給定 l,r,k 表示詢問下標為 l sim r 的區間內第 k 小的數 1 leq n leq 10 1 leq m leq 10 a leq 10 值域很大,建立權值線段樹,權值線段樹要求離散化後的值之間的大小關係不發生改變...

區間K大數

區間k大數 問題描述 給定乙個序列,每次詢問序列中第 l個數到第 r個數中第 k大的數是哪個。輸入格式 第一行包含乙個數 n,表示序列長度。第二行包含 n個正整數,表示給定的序列。第三個包含乙個正整數 m,表示詢問個數。接下來m行,每行三個數 l,r,k 表示詢問序列從左往右第 l個數到第 r個數中...

主席樹 靜態區間第k小

這是個非常經典的主席樹入門題 靜態區間第k小 資料已經過加強,請使用主席樹。同時請注意常數優化 如題,給定n個整數構成的序列,將對於指定的閉區間查詢其區間內的第k小值。輸入格式 第一行包含兩個正整數n m,分別表示序列的長度和查詢的個數。第二行包含n個整數,表示這個序列各項的數字。接下來m行每行包含...