AcWing 334 K匿名序列

2022-04-29 06:03:07 字數 904 閱讀 6897

大型補檔計畫

題目鏈結

就是把序列分成無數段,每段長度 $ >= k$,然後 \([l, r]\) 這段的花費是 \(s[r] - s[l - 1] - (r - l + 1) * a[l]\) (把所有數減成 \(a[l]\))

很容易列出狀態轉移方程:

設 \(f[i]\) 為前 i 個分完段的最小花費

\(f[i] = f[j] + s[i] - s[j] - (i - j) * a[j + 1]\)

移項:\(\underline_y = \underline_k * \underline_x - \underline_b\)

乙個鮮明的斜率優化,其中斜率、橫座標都是遞增的,用彈出法即可。

#include #include #include using namespace std;

typedef long long ll;

const int n = 500005;

const ll inf = 0x3f3f3f3f3f3f3f3f;

int n, k, a[n], q[n];

ll f[n], s[n];

ll inline y(int i)

ll inline x(int i)

int main()

while (hh < tt && y(q[hh + 1]) - y(q[hh]) <= i * (x(q[hh + 1]) - x(q[hh]))) hh++;

if (hh <= tt) f[i] = f[q[hh]] + s[i] - s[q[hh]] - (ll)(i - q[hh]) * a[q[hh] + 1];

} printf("%lld\n", f[n]);

} return 0;

}

ACWING刷題 786 第k個數

原題鏈結 做法 快速排序為基礎,用k與當前區間長度比較,進行區間剪枝,時間複雜度o 2n include using namespace std const int n 100010 int a n int quick sort int l,int r,int k int llen j l 1 左區...

題解 AcWing 786 第K個數

acwing 786.第k個數 引用星丶空大佬的題解,很不錯的思路,奇怪的思路 1 並沒有 寫乙個和yxc大佬不同但差不多思想的方法,更簡單 給定乙個長度為n的整數數列,以及乙個整數k,請用快速選擇演算法求出數列從小到大排序後的第k個數。樣例輸入格式 第一行包含兩個整數 n 和 k。第二行包含 n ...

AcWing 786 第k個數(C 演算法)

輸入格式 第一行包含兩個整數 n 和 k。第二行包含 n 個整數 所有整數均在1 109範圍內 表示整數數列。輸出格式 輸出乙個整數,表示數列的第k小數。資料範圍 1 n 100000,1 k n 輸入樣例 5 32 4 1 5 3 輸出樣例 32 基本思想 用快速選擇演算法。當分界點x左邊 有sl...