hdu4325樹狀陣列,線段樹,離散化

2021-08-27 18:09:06 字數 3568 閱讀 2555

題目:

大意:本題就是求在某個時間點上開花的朵數

思路:此題後台測試資料很水,題目給的範圍很大,但測試資料並沒有他給的這麼多,區間處理,樹狀陣列,離散化都能解

1.離散化思想:

2.線段樹思想:

3.樹狀陣列思想(線段樹的一種):

樹狀陣列:

思路:假設更新區間(a,b),從a到b每乙個點都要加上一朵,基於樹狀陣列特殊結構,這裡是假設從a點開始更新,樹狀陣列會從a點一直加到n點,所以區間更新(a,b)區間只更新a點不用乙個乙個點去加,為了不影響後面的點的更新要減去多餘增加的點update(b+1,-1);然後求sum(x);

1.樹狀陣列

#include

#include

#define len 100005

using

namespace

std;

int n,c[len],ans[len];

int lowbit(int x)

void update(int x,int p)//單點更新

int sum(int x)//起點到x點的和

int main()

for(int i=0;iscanf("%d",&q);

ans[i]=sum(q);

}printf("case #%d:\n",++count);

for(int i=0;iprintf("%d\n",ans[i]);

}return

0;}

2.樹狀陣列+離散化1

#include

#include

#include

#define len 100005

using

namespace

std;

int n,c[len],ans[len],v[len];

struct node

s[len];

int lowbit(int x)

void update(int x,int p)

int sum(int x)

int main()

for(int i=0;iscanf("%d",&h[i]),v[k++]=h[i];

sort(v,v+k);

int p=unique(v,v+k)-v;

for(int i=0;iint x=lower_bound(v,v+p,s[i].x)-v+1;

int y=lower_bound(v,v+p,s[i].y)-v+1;

update(x,1);

update(y+1,-1);

}printf("case #%d:\n",++count);

for(int i=0;iint j=lower_bound(v,v+p,h[i])-v+1;

printf("%d\n",sum(j));}}

return

0;}

2.樹狀陣列+離散化2

#include

#include

#include

#define len 100005

using

namespace

std;

int n,c[len],ank[len*2];

struct node

void update(int x,int p)

int sum(int x)

int main()

sort(s,s+h);

int k=1;

ank[s[0].i]=k;

for(int i=1;iif(s[i].x==s[i-1].x) ank[s[i].i]=k;

else ank[s[i].i]=++k;

} for(int i=0;i1;i+=2)

printf("case #%d:\n",++count);

for(int i=n;iprintf("%d\n",sum(ank[i]));

}return

0;}

3.線段樹

#include

#include

#include

#define len 100005

using namespace std;

struct node

s[len*4];

struct test

t[len];

intm,n,ans[len];

void pushup(int i)

}void build(int l,int r,int i)

void update(int l,int r,int i)

int mid=(s[i].l+s[i].r)/2;

if(mid>=r) update(l,r,i*2);

else

if(mid*2+1);

else

}void query(int i)

query(i*2);

query(i*2+1);

}int main()

build(1,max,1);

for(int i=1;i<=n;i++) update(t[i].a,t[i].b,1);

query(1);

printf("case #%d:\n",++count);

for(int i=0;i}

return

0;}

4.線段樹+離散化

#include

#include

#include

#define len 100005

using

namespace

std;

struct node

s[len*4];

struct test

}void build(int l,int r,int i)

void update(int l,int r,int i)

int mid=(s[i].l+s[i].r)/2;

if(mid>=r) update(l,r,i*2);

else

if(mid2+1);

else

}void query(int i)

query(i*2);

query(i*2+1);

}int main()

build(1,max,1);

sort(t,t+m);

k=1;

v[t[0].i]=k;

for(int i=1;iif(t[i].x==t[i-1].x) v[t[i].i]=k;

else v[t[i].i]=++k;

}for(int i=0;i1;i+=2) update(v[i],v[i+1],1);

query(1);

printf("case #%d:\n",++count);

for(int i=n;iprintf("%d\n",ans[v[i]]);

}return

0;}

hdu 1166 樹狀陣列 線段樹

一道線段樹和樹狀陣列的基礎題 用樹狀陣列做 includeusing namespace std define n 50010 int size,c n int lowbit int x void modify int i,int x int sum int i return ans int mai...

hdu 1166 線段樹 樹狀陣列

剛剛做完4351的線段樹 想起當初入門的線段樹水題 於是迅速乾掉!裸裸的超標準單點更新線段樹格式 剛剛看了樹狀陣列 用來再次刷了一次這道題 下面 2012.9.24 include include include const int maxx 50000 using namespace std in...

hdu1394 線段樹 樹狀陣列

題目 就是求乙個陣列的逆序數,然後依次將陣列的第乙個數調到最後,最後求出最小的逆序數 做了兩種,線段樹和樹狀陣列 利用線段樹求逆序數 每次將數字x插到線段樹的 x 位置,然後球一下,該線段樹右邊的和,即為逆序數的個數 第一次用線段樹,做這個。include include include inclu...