顯然有乙個線段樹套線性基的做法,但肯定會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 ...