給出兩個堆,兩個堆裡的所有數保證沒有相同的,可以將其中乙個堆的堆頂移到另乙個堆的堆頂,花費為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 你可以把任意一堆中位於頂端的物品移動到其它某堆的頂端。若此物品是當前所有物品中優先順序最高的,可以直接將之刪除而不用移動。...