BZOJ3192 JLOI2013 刪除物品

2022-05-19 21:41:06 字數 898 閱讀 7003

給出兩個堆,兩個堆裡的所有數保證沒有相同的,可以將其中乙個堆的堆頂移到另乙個堆的堆頂,花費為1,但是如果當前要移動的數為兩個堆的最大值,則不需要花費,並且將這個數刪除,求出將所有數刪除的最小花費

其實可以將兩個堆合併成乙個序列,其中第乙個堆要倒著來,這樣子只要確定斷點就可以確定兩個堆的堆頂了,而且只要斷點移動就相當於移動堆頂

首先將所有數排序,得到刪除的順序,那麼我們可以將每個數的權值設為1,那麼只要將每次斷點到要刪除的數的距離累積就可以求出答案,但是如果要刪除的話,就要這個數的權值變為0,但是暴力肯定不行

所以我們用樹狀陣列維護字首和

注意:答案可能會爆int,要加long long

#include#include

#include

#include

#include

using

namespace

std;

int s[110000

];struct

node

l[110000

];typedef

long

long

ll;int a[110000

];int cmp(const

void *xx,const

void *yy)

int mx[110000

];int lowbit(int x)

intn;

void change(int x,intd)}

int getsum(int

x)

return

ans;

}int

main()

printf(

"%lld\n

",ans);

return0;

}

BZOJ3192 JLOI2013 刪除物品

原題位址 自己想的奇葩做法 對於乙個優先順序為x的物品,考察該物品下方優先順序大於x物品的優先順序被分成了多少個連續段 舉個例子,如x 4,該物品下方物品的優先順序有5,6,7,9,10,13,14,19,則段數為4 則該物品需要被移動的次數k 段數 2 優先順序為x 1的物品在該物品下方?1 0 ...

bzoj 3192 JLOI2013 刪除物品

因為只有兩堆,所以方案數顯然唯一。可以將兩隊合併成乙個陣列,用樹狀陣列維護,每次刪乙個點的代價就是最大值到次大值得距離。一開始假裝兩堆中間有個無限大的數。有點坑點,裡有注釋。code include include include include include include define ll ...

bzoj3192 JLOI2013 刪除物品

description 箱子再分配問題需要解決如下問題 1 一共有n個物品,堆成m堆。2 所有物品都是一樣的,但是它們有不同的優先順序。3 你只能夠移動某堆中位於頂端的物品。4 你可以把任意一堆中位於頂端的物品移動到其它某堆的頂端。若此物品是當前所有物品中優先順序最高的,可以直接將之刪除而不用移動。...