CF 12D BALL 線段樹 樹狀陣列

2022-05-24 10:21:13 字數 2658 閱讀 6524

線段樹view code

#include#include

#include

using

namespace

std;

const

int inf = ~0u>>2

;const

int n = 500010

;#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

int max[n<<2

];struct

node

in[n];

inttot,n;

intnum[n];

int max(int a,int

b)void pushup(int

rt)void build(int l,int r,int

rt)void update(int p,int val,int l,int r,int

rt)

int m=(l+r)>>1

;

if(p<=m) update(p,val,lson);

else

update(p,val,rson);

pushup(rt);

}int query(int l,int r,int l,int r,int

rt)void

init()

inline

intcmp(node a,node b)

intmain()

for(i=1;i<=n;i++) scanf("

%d",&in

[i].y);

for(i=1;i<=n;i++) scanf("

%d",&in

[i].z);

init();

sort(

in+1,in+n+1

,cmp);

int ans=0

;

for(i=1;i<=n;i=j)

for(;i<=j-1;i++)

update(

in[i].x,in[i].z,1,tot,1

); }

printf(

"%d\n

",ans);

return0;

}/*31 3 5

2 4 6

3 5 7

*/

樹狀陣列

view code

/*

cf 12d

樹狀陣列好題

給你n個整數三元組,

對於某個三元組,判斷是否存在乙個三元組的元素都大於這個三元組

題目給三個數,必然有其道理

可以把其中乙個數離散化當做樹狀陣列的下標,再按照另外某個數排序

最後就只需利用樹狀陣列陣列處理好最後乙個數就行了

具體做法:

比如對x離散化 對y降序排序

x當做樹狀陣列的下標

每次把y值相同的三元組一起拿出來處理

因為前面加進樹狀陣列的數的y值肯定比現在這個數的y值要大,這乙個數就不必考慮了

然後就是找前面加進樹狀陣列的數中有沒有z座標 大於 當前列舉的數的z座標,當然是在大於x的區間內

這裡與樹狀陣列的功能相反了,這裡樹狀陣列是求前n項中的最大值,而題目要求下標在x->n間的最大值

轉換一下就好了

離散化前:1 3 5 7 9

離散化後並不是1 2 3 4 5

要倒過來:5 4 3 2 1

那麼小於x的區間實際上就是大於x的區間

*/#include

#include

#include

using

namespace

std;

const

int n = 500010

;int

c[n];

intnum[n];

intn;

struct

node

in[n];

inline

void max(int &a,int

b)void update(int x,int

d)int sum(int

x)void

init()

inline

intcmp(node a,node b)

intmain()

for(i=1;i<=n;i++) scanf("

%d",&in

[i].y);

for(i=1;i<=n;i++) scanf("

%d",&in

[i].z);

init();

memset(c,

0,sizeof

(c));

sort(

in+1,in+n+1

,cmp);

int ans=0

;

for(i=1;i<=n;i=j)

for(;i<=j-1;i++)

update(

in[i].x,in

[i].z);

}printf(

"%d\n

",ans);

return0;

}/*31 3 5

2 4 6

3 5 7

*/

CF 19D Points 線段樹 平衡樹

在平面上進行三種操作 1 add x y 在平面上新增乙個點 x,y 2 remove x y 將平面上的點 x,y 刪除 3 find x y 在平面上尋找乙個點,使這個點的橫座標大於x,縱座標大於y,而且要求他的橫座標盡量小,如果有多個點滿足,則選取橫座標盡量小的前提下,縱座標最小的點。方法 將...

CF 19D Points 線段樹 平衡樹

在平面上進行三種操作 1 add x y 在平面上新增乙個點 x,y 2 remove x y 將平面上的點 x,y 刪除 3 find x y 在平面上尋找乙個點,使這個點的橫座標大於x,縱座標大於y,而且要求他的橫座標盡量小,如果有多個點滿足,則選取橫座標盡量小的前提下,縱座標最小的點。方法 將...

cf474e Pillars 線段樹優化dp

有n個柱子,每個柱子有乙個高度hi h i,每個柱子可以跳到它後面高度與它相差大於d的柱子 即 h i hj d hi hj d 求最多可以跳多少個柱子an si m ax a nsj 1 hi h j d且 ja ns i ma x an sj 1 h i hj d且 j 因此建立一棵線段樹,節點...