xsy1144 選物品 主席樹

2022-05-03 19:03:09 字數 958 閱讀 6791

題目大意:$n$ 件物品擺成一排,給每個物品定義兩個屬性 $a$ 和$ b$,兩件物品的 差異度 定義為它們兩種屬性的差的絕對值中較大的乙個。如果要求出一些物品的差異度,我們先定義乙個 理想物品,使它與這些物品中每個物品的差異度的和最小,這些物品的差異度就是這個最小的和。給定$ n$ 個物品和q組詢問,詢問從 $l $到 $r$ 的物品差異度為多少。

我們設物品$i$和物品$j$之間的差異度為$d$,則

$d=max\$

$=max\$

我們令$x_i=a_i+b_i,x_j=a_j+b_j,y_i=a_i-b_i,y_j=a_j-b_j$。

則有$d=max\$

簡單化簡後,$d=|x_i-x_j|+|y_i-y_j|$。

對於每一件物品,我們求出其對應的$x$值和$y$值。

我們建兩棵主席樹,分別維護$x$值和$y$值。

查詢乙個區間時,我們在兩棵主席樹上分別查詢區間中位數,然後隨便維護一下就行了。

時間複雜度:$o(n\log\ n)$。

1 #include2

#define m 100005

3#define l long long

4#define inf (2e9)

5using

namespace

std;

67 l n,q,a[m]=,b[m]=;

89 l lc[m*70]=,rc[m*70]=,siz[m*70]=,cnt=0; l sum[m*70]=;

10 l root1[m]=,root2[m]=;

11void add(l &x,l l,l r,l now)

18l getkth(l x,l y,l l,l r,l k)

24l getsum(l x,l l,l r,l ll,l rr)

3132

main()

42while(q--)

59 }

114 國王遊戲

除第乙個人以外的每個人能獲得的獎賞為他之前所有人的左手乘積除以自己右手上的值 注意是之前的所有人不包括自己 通過改變順序使得獲得最多獎賞最小化。貪心策略 受到奶牛的雜技這題的影響,我們發現乘積越大的要往後放除的大的也要往後放,所以我們根據左手右手的乘積從小到大排序,然後以此計算取max即可,交了之後...

11 4 結構示例

下面各節將展示兩個關於使用struct型別的重要示例,它們將各自建立乙個型別,這兩個型別可以像c 語言的內建型別那樣使用,但它們分別具有修改了的語義。using system public struct dbint 如果dbint表示乙個未知的值,則isnull屬性為true。public bool...

11 4 無序容器

目錄共有四種無序容器 unorder set unorder map unorder multiset unorder multimap 有序容器用比較運算子組織元素 無序容器用hash函式和關鍵字型別的 組織元素 何時使用 如果關鍵字本身是無序的,且發現問題可以轉換為用hash技術解決,就應該採用...