hdu 4417 2012杭州網路賽 劃分樹
劃分樹,對區間進行二分求 第mid 大的數 並且和 H比較即可。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 100010 #define lson u<<1 #define rson u<<1|1 int sorted[MAXN],val[20][MAXN],Lnum[20][MAXN]; int n,q,high; struct Node{ int lef,rig,mid; }T[MAXN<<2]; void Build(int u,int l,int r,int d){ T[u].lef=l; T[u].rig=r; T[u].mid=(l+r)>>1; if(l==r)return; int mid=T[u].mid; int lsame=mid-l+1; for(int i=l;i<=r;i++){ if(val[d][i]<sorted[mid])lsame--; } int p=T[u].lef,q=T[u].mid+1,same=0; for(int i=l;i<=r;i++){ if(i==l)Lnum[d][i]=0; else Lnum[d][i]=Lnum[d][i-1]; if(val[d][i]<sorted[mid]){ val[d+1][p++]=val[d][i]; Lnum[d][i]++; } else if(val[d][i]>sorted[mid]){ val[d+1][q++]=val[d][i]; } else { if(same<lsame){ val[d+1][p++]=val[d][i]; Lnum[d][i]++; same++; } else val[d+1][q++]=val[d][i]; } } Build(lson,l,mid,d+1); Build(rson,mid+1,r,d+1); } int Query(int u,int l,int r,int d,int k){ if(l==r)return val[d][l]; else { int n1,n2; if(l==T[u].lef){n1=0;n2=Lnum[d][r];} else {n1=Lnum[d][l-1];n2=Lnum[d][r]-n1;} if(n2>=k){ int newl=T[u].lef+n1; int newr=T[u].lef+n1+n2-1; return Query(lson,newl,newr,d+1,k); } else { int newl=T[u].mid+1+(l-T[u].lef-n1); int newr=newl+(r-l+1-n2)-1; return Query(rson,newl,newr,d+1,k-n2); } } } int bsearch(int l,int r,int key){ int mid; int low=1,high=r-l+1; while(low<high){ mid=low+(high-low)/2; int tmp=Query(1,l,r,0,mid); if(tmp<=key)low=mid+1; else high=mid; } if(Query(1,l,r,0,low)>key)return low-1; else return low; } int main(){ int t; scanf("%d",&t); for(int cas=1;cas<=t;cas++){ scanf("%d%d",&n,&q); for(int i=1;i<=n;i++){ scanf("%d",&val[0][i]); sorted[i]=val[0][i]; } sort(sorted+1,sorted+1+n); Build(1,1,n,0); int l,r,h; printf("Case %d:\n",cas); while(q--){ scanf("%d%d%d",&l,&r,&h); printf("%d\n",bsearch(l+1,r+1,h)); //Query(1,l+1,r+1,0,2); } } }
相關推薦
hdu 4417 2012杭州網路賽 劃分樹
劃分樹,對區間進行二分求 第mid 大的數 並且和 H比較即可。。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> usin
【ZOJ 4053】【青島網路賽主席樹+啟發式合併】
題意: 給你一個數組,每次給你一個數,將這個數從整個陣列中刪去。然後陣列被劃分成了多個小區間,問你各個區間中最大的逆序對是多少。 思路: 首先建立一顆主席樹維護區間[1,x]的資訊。
hdu-5489/2015合肥網路賽 Removed Interval (LIS變形)
Removed Interval Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
2018CCPC網路賽-線段樹求區間最值+離散化+dp
原題目描述在最下面。 1e5個點,問從(0,0)走到(1e9,1e9)的最大收益。 當你從(u-1,v-1)走到(u,v)時,你可以獲得點(u,v)的權值。 solution: 十分詳細了。 直接線段樹區間最值。當然也可以樹狀陣列,不能st表。 dp
【HDU 4417】Super Mario 【主席樹】
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #inc
HDU 4417 劃分樹寫法
des eve else eight url ted nta namespace pan Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ab
hdu 4417 劃分樹
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4041 Accepted S
HDU 4417 Super Mario (樹狀陣列+離線處理)(劃分樹+二分答案)
題意: 給定1--n區間,有q個詢問,詢問l,r,k表示區間[l,r]小於等於k的數的個數 思路: 可以用劃分樹(求區間第k大值)變形一下,來求小於等於k的個數,但是此題直接離線處理詢問高效的多。 首先將1--n區間的值記錄位置,從小到大排序,每個詢問按照k值從小到大排序,
HDU 4417 (離線線段樹 || 劃分樹 )
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6291 Accepted S
HDU 4417 Super Mario--離線樹狀陣列、劃分樹、線段樹
題意:詢問區間[l,r]內有幾個數字小於h 思路:對於每次詢問H,L,R,僅需要考慮比H小的hi在L,R範圍內的個數; 為了避免比H大的hi的影響,可以想到對詢問H,和hi進行排序 在詢問H時,僅將比H小的hi插入到樹狀陣列中 #include<
hdu 2665 Kth number(劃分樹)
first con build 這一 cst second class stream tom Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth
(樹狀數組+離線查詢)HDU 4417 - Super Mario
blog 數組 string 個數 r++ dex 分塊 每次 class 題意: 給定一個數列,最多10萬次查詢l到r不超過h的數字的個數。 分析: 唉,太菜啦。 在線做法應該比較明顯,區間維護平衡樹,用線段樹套平衡樹,或者分塊套平衡樹,應該都能A,但是沒試
[hdu 4417]樹狀數組+離散化+離線處理
style code upper unique opera 鏈接 ems ons back 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 把數字離散化,一個查詢拆成兩個查詢,每次查詢一個前綴的和。主要問題是這個數組是
HDU 4417 Super Mario(主席樹)
there mon ref seve pin ans ins Go follow Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T
hdu 3473 (劃分樹)2
mage def typedef sin else BE IT ext cati Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
HDU - 4417 Super Mario 主席樹
數量 \n make In printf ons bound update ket 題意: 給一個數列$\{ a_i \}$,一些詢問$(l_i,r_i,h_i)$,求$j\in [l_i,r_i] ,a_j<=h_i$的元素數量 題解: 問區間內$<=
HDU 6271 Master of Connected Component(2017 CCPC 杭州 H題,樹分塊 + 並查集的撤銷)
AS true typedef cpp define spa tac assert struct 題目鏈接 2017 CCPC Hangzhou Problem H 思路:對樹進行分塊。把第一棵樹分成$\sqrt{n}$塊,第二棵樹也分成$\sqrt{n}$塊。
hdu 4417 Super Mario (主席樹)
代碼 i++ uil 我們 php amp build iostream sort 鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 題意: 給你段長為n的序列,有q個詢問,每次詢問區間[l.r]內有多少個數小於等於k
HDU 4417.Super Mario-無修改區間小於等於H的數的個數-可持久化線段樹
url java ios else string mes clu ber lower Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot
【HDU - 薛貓貓杯程式設計網路賽】【題解】
A 爬山 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 0 &