HDU6579 區間線性基

2021-10-04 15:23:21 字數 1477 閱讀 8778

顯然有乙個線段樹套線性基的做法,但肯定會t飛

於是我們考慮字首和的思想維護,p[i

][j]

p[i][j]

p[i][j

]表示以i

ii為右端點,1

11為左端點的線性基的第j

jj位,但是我們如果直接按順序插入數的話,那麼顯然左邊的數優先順序高於右邊的數,我們考慮如何使右邊的數的優先順序高於左邊(可能不太嚴謹,見諒 ),於是插入數的時候同時維護乙個pos

[i][

j]pos[i][j]

pos[i]

[j],表示以i

ii為右端點,1

11為左端點的線性基的第j

jj位的這個數在原序列的位置。

假設當前在插入x這個數,到了第j位,如果原來p[i

][j]

p[i][j]

p[i][j

]已經插入過乙個數,但如果原先該數的pos

pospo

s值小於x

xx的pos

pospo

s值,我們就將他們交換,繼續向下插入原來p[i

][j]

p[i][j]

p[i][j

]這個數,顯然這樣的插入一定保證了最優

那麼每次詢問(l,

r)(l,r)

(l,r

)時,就從右端點為r

rr的線性基中求答案,如果其中有的數的位置在l

ll的左邊,那麼就跳過。

#include

#define m 500009

using

namespace std;

intread()

for(

;isdigit

(ch)

;ch=

getchar()

) re=

(re<<3)

+(re<<1)

+ch-

'0';

return re*f;

}int pos[m][32

],p[m][32

],t,n,m,lastans;

void

insert

(int val,

int num,

int po)

else

if(pos[num]

[i]val^

=p[num]

[i];}}

return;}

intquery

(int l,

int r)

signed

main()

for(

int i=

1;i<=m;i++

)else}}

return0;

}

hdu 1698 區間更新

基礎題 初學 include include using namespace std define lson l m rt 1 define rson m 1 r rt 1 1 const int maxn 101000 int h w n int col maxn 2 標記是否當前節點梗係 int...

hdu 4883 區間選點

昨天比賽的時候沒有做出來,本來是想用貪心的,但是貪了好久都沒有招,今天在網上搜了解題報告 好像說這是一類區間選點問題 有乙個好的做法 1 首先把題目中的時間全轉化為分鐘,那麼區間就在0 1440中間 2 對於n組人,有乙個si 和乙個ei,那麼開個陣列,cnt si d cnt ei d 3 也就是...

hdu5812 區間操作

題意 給兩個數字序列a,b,在給出m次區間,每次區間操作可以對l i r i 間的數字進行任意排列,問序列a能否在m次操作後變為序列b.思路 貪心思想,每次操作都使a i 盡可能的靠近它的期望位置,所以對每個操作區間按照它的期望位置排序,結果和b序列一樣那就yes。o n 2 可以處理出每個a i ...