hdu 4417 區間內比h小的數 劃分樹

2022-06-03 14:06:12 字數 1595 閱讀 5896

二分查詢最近乙個比h小的數

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8#define for0n for(i=0;i9

#define for1n for(i=1;i<=n;i++)

10#define for0m for(i=0;i11

#define for1m for(i=1;i<=m;i++)

12#define cl(a) memset(a,0,sizeof(a))

13#define w12 while(scanf("%d%d",&n,&m)!=eof)

14#define s12 scanf("%d%d",&n,&m);

15#define sa scanf("%d",a[i]);

16#define sb scanf("%d",b[i]);

17#define qq printf("*****\n");

18const

int maxn=1005;19

intn,m,tt;

20const

int maxn = 100010;21

int tree[20][maxn];//

表示每層每個位置的值

22int sorted[maxn];//

已經排序好的數

23int toleft[20][maxn];//

toleft[p][i]表示第i層從1到i有數分入左邊

24void build(int l,int r,int

dep)

2543

else

44 tree[dep+1][rpos++] =tree[dep][i];

45 toleft[dep][i] = toleft[dep][l-1] + lpos -l;46}

47 build(l,mid,dep+1

);48 build(mid+1,r,dep+1

);49}50

//查詢區間第k大的數,[l,r]是大區間,[l,r]是要查詢的小區間

51int query(int l,int r,int l,int r,int dep,int

k)52

62else

6368}69

int solve(int n,int s,int t,int

h)70

83else r=mid-1;84

}85return

ans;86}

87int

main()

88105 sort(sorted+1,sorted+n+1

);106 build(1,n,0

);107

ints,t,k;

108 printf("

case %d:\n

",ca);

109while(m--)

110116

}117

return0;

118 }

HDU4417(主席樹計數)

解題思路 如果說用排序,那麼複雜度就是o mnlogn 會超時。用主席樹的空間複雜度是o nlogn 時間複雜度是o max nlogn,mlogn 這道題稍微修改一下query函式即可。include include include include define n 100009 using na...

HDU 4417 (二分 區間第k大)

查詢區間 l,r 中有多少數 比給定的 h 小。我們可以這麼想,h 一定會比 區間的第 x 大 第 x 1 小。怎麼確定 x。這是乙個單調的問題,所以二分 區間第 k 大就可以確定了。include include include include using namespace std const ...

HDU 4417 水題 樹狀陣列

題目大意 給n個數字,m個詢問 每次詢問 l,r 區間的數字,比k小的數字有多少個。下標從0 n 1 直接離線後樹狀陣列,聽說劃分樹也能過 略微更新的我的破爛離散化小板子 include using namespace std define pr x cout x vectormp maxn voi...