這篇文章主要講解了“THE函數式線段樹代碼怎么寫”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“THE函數式線段樹代碼怎么寫”吧!

THE函數式線段樹代碼:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson st[num].ls
#define rson st[num].rs
using namespace std;
const int MAXN = 100100;
struct node
{
int ls,rs,cnt;
};
struct fSTree
{
node st[MAXN*20];
int rt[MAXN],cur,rc;
inline void _pushUp(int num)
{
st[num].cnt=st[lson].cnt+st[rson].cnt;
}
inline int _build(int l,int r)
{
int num=cur++;
if(l==r)
{
st[num].cnt=0;
return num;
}
int m=(l+r)>>1;
st[num].ls=_build(l,m);
st[num].rs=_build(m+1,r);
_pushUp(num);
return num;
}
inline int _insert(int pos,int l,int r,int last)
{
int num=cur++;
st[num]=st[last];
if(l==r)
{
st[num].cnt++;
return num;
}
int m=(l+r)>>1;
if(pos>m) st[num].rs=_insert(pos,m+1,r,st[num].rs);
else st[num].ls=_insert(pos,l,m,st[num].ls);
_pushUp(num);
return num;
}
inline int _quire(int k,int v,int o,int l,int r)
{
if(l==r)
return l;
int res = st[st[o].ls].cnt - st[st[v].ls].cnt,m=(l+r)>>1;
if(k<=res)
return _quire(k,st[v].ls,st[o].ls,l,m);
else
return _quire(k-res,st[v].rs,st[o].rs,m+1,r);
}
inline void init(int n)
{
cur=rc=0;
rt[rc++]=_build(1,n);
}
inline void insert(int n,int pos)
{
rt[rc]=_insert(pos,1,n,rt[rc-1]);
rc++;
}
inline int quire(int n,int k,int l,int r)
{
return _quire(k,rt[l-1],rt[r],1,n);
}
}fst;
int hl[MAXN],hs[MAXN];
int main()
{
//freopen("hdu2665.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&hs[i]);
hl[i]=hs[i];
}
sort(hl+1,hl+n+1);
int nn=unique(hl+1,hl+n+1)-hl-1;
fst.init(nn);
for(int i=1;i<=n;i++)
fst.insert(nn,lower_bound(hl+1,hl+1+nn,hs[i])-hl);
while(m--)
{
int s,t,k;
scanf("%d%d%d",&s,&t,&k);
int idx = fst.quire(nn,k,s,t);
printf("%d\n",hl[idx]);
}
}
return 0;
}------------------------------------------------
poj 2761
一樣的題目啊..結果背板都被擊沉一發 - -
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson st[num].ls
#define rson st[num].rs
using namespace std;
const int MAXN = 100100;
struct node
{
int ls,rs,cnt;
};
struct
{
int rt[MAXN],cur,rc;
node st[MAXN*20];
inline void _pushUp(int num)
{
st[num].cnt=st[lson].cnt+st[rson].cnt;
}
inline int _build(int l,int r)
{
int num=cur++,m=(l+r)>>1;
if(l==r)
{
st[num].cnt=0;
return num;
}
st[num].ls=_build(l,m);
st[num].rs=_build(m+1,r);
_pushUp(num);
return num;
}
inline int _insert(int pos,int l,int r,int last)
{
int num=cur++,m=(l+r)>>1;
st[num]=st[last];
if(l==r)
{
st[num].cnt++;
return num;
}
if(pos>m)
st[num].rs=_insert(pos,m+1,r,st[num].rs);
else
st[num].ls=_insert(pos,l,m,st[num].ls);
_pushUp(num);
return num;
}
inline int _quire(int k,int o,int v,int l,int r)
{
if(l==r)
return l;
int res=st[st[v].ls].cnt-st[st[o].ls].cnt,m=(l+r)>>1;
if(k<=res)
return _quire(k,st[o].ls,st[v].ls,l,m);
else
return _quire(k-res,st[o].rs,st[v].rs,m+1,r);
}
inline void init(int n)
{
cur=rc=0;
rt[rc++]=_build(1,n);
}
inline void insert(int n,int pos)
{
rt[rc]=_insert(pos,1,n,rt[rc-1]);
rc++;
}
inline int quire(int n,int k,int l,int r)
{
return _quire(k,rt[l-1],rt[r],1,n);
}
}fst;
int hl[MAXN],hs[MAXN];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&hs[i]);
hl[i]=hs[i];
}
sort(hl+1,hl+n+1);
int nn=unique(hl+1,hl+n+1)-hl-1;
fst.init(nn);
for(int i=1;i<=n;i++)
fst.insert(nn,lower_bound(hl+1,hl+nn+1,hs[i])-hl);
while(m--)
{
int s,t,k;
scanf("%d%d%d",&s,&t,&k);
printf("%d\n",hl[fst.quire(nn,k,s,t)]);
}
}
return 0;
}感謝各位的閱讀,以上就是“THE函數式線段樹代碼怎么寫”的內容了,經過本文的學習后,相信大家對THE函數式線段樹代碼怎么寫這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯網站建設公司,,小編將為大家推送更多相關知識點的文章,歡迎關注!
文章名稱:THE函數式線段樹代碼怎么寫-創新互聯
瀏覽地址:http://www.yijiale78.com/article32/cchppc.html
成都網站建設公司_創新互聯,為您提供企業網站制作、企業建站、云服務器、網站建設、App開發、服務器托管
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯