BZOJ3192 JLOI2013 刪除物品

2021-07-04 05:42:00 字數 902 閱讀 3581

原題位址

自己想的奇葩做法…

對於乙個優先順序為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 求出將所有物品刪除所...