BZOJ 1563 四邊形不等式

2022-08-02 17:54:08 字數 3367 閱讀 4260

對於每組資料,若最小的不協調度不超過1018,則第一行乙個數表示不協調度若最小的不協調度超過1018,則輸出"too hard to arrange"(不包含引號)。每個輸出後面加"--------------------"

44 9 3

brysj,

hhrhl.

yqqlm,

gsycl.

4 9 2

brysj,

hhrhl.

yqqlm,

gsycl.

1 1005 6

poet

1 1004 6

poet

108--------------------

32--------------------

too hard to arrange

--------------------

1000000000000000000

--------------------

【樣例說明】

前兩組輸入資料中每行的實際長度均為6,後兩組輸入資料每行的實際長度均為4。乙個排版方案中每行相鄰兩個句子之間的空格也算在這行的長度中(可參見樣例中第二組資料)。每行末尾沒有空格。

總共10個測試點,資料範圍滿足:

測試點 t n l p

1 ≤10 ≤18 ≤100 ≤5

2 ≤10 ≤2000 ≤60000 ≤10

3 ≤10 ≤2000 ≤60000 ≤10

4 ≤5 ≤100000 ≤200 ≤10

5 ≤5 ≤100000 ≤200 ≤10

6 ≤5 ≤100000 ≤3000000 2

7 ≤5 ≤100000 ≤3000000 2

8 ≤5 ≤100000 ≤3000000 ≤10

9 ≤5 ≤100000 ≤3000000 ≤10

10 ≤5 ≤100000 ≤3000000 ≤10

所有測試點中均滿足句子長度不超過30。

四邊形不等式優化dp使用條件:

若dp[i] = min(dp[j] + val(i, j)), 如果val(i, j)滿足(val(i, j) + val(i + 1, j + 1) <= val(i, j + 1) + val(i + 1, j),即val滿足四邊形不等式,則該dp方程滿足決策單調性。

即對每乙個dp[i],其轉移過來的位置p[i]序列有單調性。

利用決策單調性,將複雜度降低至nlogn。

具體操作:

建乙個元素為(x, l, r)(表示l ~ r之間的dp值最優決策都是由位置x處轉移)的佇列。

(1) 每次更新檢查隊頭的r是否為i - 1,如果是,踢掉;否則更新隊頭的l值為i;

(2)直接取隊頭的x值更新dp[i],即dp[i] = dp[x] + val(i, x);

接下來要維護隊尾滿足決策單調

(3)如果隊尾的l, x滿足dp[x] + val(l, x) > dp[i] + val(l, i) 踢掉; 不斷重複此操作

(4)在隊尾的區間內二分得到最小的ans(預設r + 1),使得dp[i] + val(ans, i) < dp[x] + val(ans, x);

(5)更改隊尾r為ans - 1;隊尾加入(i, ans, n)

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10 #include 11 #include 12 #include 13 #include

14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21

22using

namespace

std;

2324

#define pau system("pause")

25#define ll long long

26#define pii pair27

#define pb push_back

28#define mp make_pair

29#define mp make_pair

30#define pli pair31

32const

double pi = acos(-1.0

);33

const

int inf = 0x3f3f3f3f;34

const

int mod = 1e9 + 7;35

const

double eps = 1e-9;36

37/*

38#include

39#include

40using namespace __gnu_pbds;

41#define tree, rb_tree_tag, tree_order_statistics_node_update> tree

42tree t;

43*/

4445

const

int m = 1018;46

int t, n, l, p, a[100015], sum[100015

];47

long

double dp[100015

];48

struct

gg 51 gg (int x, int l, int

r) : x(x), l(l), r(r) {}

52 } g[100015

];53

intql, qr;

54char s[35

];55

long

double val(int i, int

j) 58

intmain()

67 g[ql = qr = 1] = gg(0, 1

, n);

68for (int i = 1; i <= n; ++i)

79int s = g[qr].l, e = g[qr].r, ans = e + 1

, mi;

80 j =g[qr].x;

81while (s <=e)

86 g[qr].r = ans - 1;87

if (ans <= n) g[++qr] =gg(i, ans, n);88}

89if (dp[n] <=1e18) else

94 puts("

--------------------");

95}96return0;

97 }

view code

四邊形不等式

總結一下最近幾天對dp優化中的四邊形不等式的學習。證明什麼的似懂非懂,我還是太年輕了。第一種,n 2 nlogn 例題 由於許可權問題 不公開題面 就是1個體積均為1 300,100000個物品,做乙個100000的揹包。發現體積最多只有 300 種,分開做。對於同種體積的物品,顯然按照價值從大到小...

四邊形不等式

若有函式 a i,j 令 i,若有 a i j a i 1 j 1 le a i j 1 a i 1 j 則我們稱函式 a 滿足四邊形不等式。若我們在 dp 過程中會用到類似如下形式的方程 dp i j min dp k j or dp i k dp k 1 j w i j 那麼,只要代價函式 w ...

四邊形不等式相關

四邊形不等式,即 w i j w i j w i j w i j 其中 i i j j 順便推薦兩篇 四邊形不等式 動態規劃演算法優化技巧 我是這麼總結的 1 狀態轉移方程形如 f i opt 其中b i j i 1 說明 b i 是根據題目描述的可以決策狀態i的左邊界,w j i 是狀態j轉移到狀...