原題位址
自己想的奇葩做法…
對於乙個優先順序為x的物品,考察該物品下方優先順序大於x物品的優先順序被分成了多少個連續段(舉個例子,如x=4,該物品下方物品的優先順序有5,6,7,9,10,13,14,19,則段數為4),則該物品需要被移動的次數k=段數*2-(優先順序為x+1的物品在該物品下方?1:0).
用的是zkw線段樹維護資訊,略複雜,就當是練手zkw線段樹了…
ac code:
#include
#include
#include
#include
using
namespace
std;
const
int n=100010;
int n1,n2,s;
int a1[n],a2[n];
long
long ans;
struct d
d(int val,int typ,int num):val(val),typ(typ),num(num) {}
friend
bool
operator
<(d x,d y)
}struct nod;
struct segtree
int query(int l,int r)
if((rp&1)&&t[rp^1].tot)
}return sum;
}void insert(int p)
}void clear()
};int main()
t.clear();
for(int i=n2;i>=1;i--)
printf("%lld\n",ans);
return0;}
bzoj 3192 JLOI2013 刪除物品
因為只有兩堆,所以方案數顯然唯一。可以將兩隊合併成乙個陣列,用樹狀陣列維護,每次刪乙個點的代價就是最大值到次大值得距離。一開始假裝兩堆中間有個無限大的數。有點坑點,裡有注釋。code include include include include include include define ll ...
bzoj3192 JLOI2013 刪除物品
description 箱子再分配問題需要解決如下問題 1 一共有n個物品,堆成m堆。2 所有物品都是一樣的,但是它們有不同的優先順序。3 你只能夠移動某堆中位於頂端的物品。4 你可以把任意一堆中位於頂端的物品移動到其它某堆的頂端。若此物品是當前所有物品中優先順序最高的,可以直接將之刪除而不用移動。...
BZOJ 3192 JLOI2013 刪除物品
箱子再分配問題需要解決如下問題 1 一共有n個物品,堆成m堆。2 所有物品都是一樣的,但是它們有不同的優先順序。3 你只能夠移動某堆中位於頂端的物品。4 你可以把任意一堆中位於頂端的物品移動到其它某堆的頂端。若此物品是當前所有物品中優先順序最高的,可以直接將之刪除而不用移動。5 求出將所有物品刪除所...