HDU4417 Super Mario 主席树
生活随笔
收集整理的這篇文章主要介紹了
HDU4417 Super Mario 主席树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歡迎訪問~原文出處——博客園-zhouzhendong
去博客園看該題解
題目傳送門 - HDU4417
題意概括
給定一個長度為n的區間,同時給出m個詢問,每次詢問在區間[l,r]中有多少個數小于或等于k。
題解
幾乎是模板題。
我們只需要把query函數隨便改改就可以了。
代碼
#include <cstring> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; const int N=100005,S=N*4*20; int T,n,m,root[N],ls[S],rs[S],sum[S],v[N],ha[N],cnt,total; void pushup(int rt){sum[rt]=sum[ls[rt]]+sum[rs[rt]]; } int build(int le,int ri){int rt=++total;if (le==ri){ls[rt]=rs[rt]=sum[rt]=0;return rt;}int mid=(le+ri)>>1;ls[rt]=build(le,mid);rs[rt]=build(mid+1,ri);pushup(rt);return rt; } int update(int rt,int le,int ri,int pos){int now=++total;if (le==ri){sum[now]=sum[rt]+1;ls[now]=rs[now]=0;return now;}int mid=(le+ri)>>1;if (pos<=mid)ls[now]=update(ls[rt],le,mid,pos),rs[now]=rs[rt];elsers[now]=update(rs[rt],mid+1,ri,pos),ls[now]=ls[rt];pushup(now);return now; } int query(int rt1,int rt2,int le,int ri,int val){if (ha[ri]<=val)return sum[rt2]-sum[rt1];if (ha[le]>val)return 0;int mid=(le+ri)>>1;return query(ls[rt1],ls[rt2],le,mid,val)+query(rs[rt1],rs[rt2],mid+1,ri,val); } int main(){scanf("%d",&T);for (int Case=1;Case<=T;Case++){printf("Case %d:\n",Case);scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%d",&v[i]),ha[i]=v[i];sort(ha+1,ha+n+1);cnt=1;for (int i=2;i<=n;i++)if (ha[i]!=ha[i-1])ha[++cnt]=ha[i];total=0;root[0]=build(1,cnt);for (int i=1;i<=n;i++){v[i]=lower_bound(ha+1,ha+cnt+1,v[i])-ha;root[i]=update(root[i-1],1,cnt,v[i]);}for (int i=1;i<=m;i++){int a,b,v;scanf("%d%d%d",&a,&b,&v);printf("%d\n",query(root[a],root[b+1],1,cnt,v));}}return 0; }
轉載于:https://www.cnblogs.com/zhouzhendong/p/HDU4417.html
總結
以上是生活随笔為你收集整理的HDU4417 Super Mario 主席树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery BreakingNews
- 下一篇: acm之vim的基本配置