NKOJ 3545 接近(DP 單調佇列)

2021-08-09 04:28:50 字數 1236 閱讀 9932

問題描述

對於乙個數字序列a,並且有若干詢問。對於每個詢問,要求求出一段在序列a中非空 的連續段使得這一段數字的總和的絕對值盡量接近p。

輸入格式

第一行2個數n、t,表示序列的長度和詢問的個數。

接下來一行n個整數,表示a序列。 接下來t行,每行乙個數p表示詢問。

輸出格式

共輸出t行,每行對應乙個詢問的答案。

輸出3個數:第乙個數為能夠實現的最接近p 的數,後面兩個數l、r表示a序列中的l到 r這一段數能實現這個答案。

如果存在多解,輸出l最小的解;

如果還有多解,輸出r最小的解。

樣例輸入

5 1

-10 -5 0 5 10

3

樣例輸出

5 2 2

資料範圍

30%的資料 1<=n<=1,000。

60%的資料 1<=n<=10,000。

100%的資料 1<=n<=100,000,a 序列中數字絕對值<=10,000,t<=100,詢問的 數字<=10^9

此題容易想到求出字首和陣列su

m ,鑑於複雜度,需要乙個o(

n)的演算法,但此時遇到的問題就是,字首和陣列並不具有單調性。

注意到題目中的絕對值,於是學習到了乙個大膽的操作,將字首和陣列排序,強行維護單調性,而且位置座標並不會對答案產生影響,於是就單調dp即可。

**:

#include

#include

#include

#define ll long long

using

namespace

std;

struct node;

bool cmp(node a,node b)

printf("%lld %lld %lld\n",ans,l+1,r);

}int main()

NKOJ3545 單調佇列

單調佇列是也。nkoj3545 我們發現,本題的時間複雜度必須是線性的,時間複雜度只能是 o nt 於是我們考慮如果如果原函式是單調的,字首和也是單調的,那麼本題就很好搞了。在這種特殊情況下,我們利用單調佇列,乙個指向開頭乙個指向末尾。由於sum r sum l p時,向右移動r不會對答案進行更新 ...

NKOJ 3861 子矩陣(矩陣dp 單調佇列)

問題描述 小 a 有乙個 n m 的矩陣,矩陣中 1 n m 這 n m 個整數均出現過一次。現在小 a 在這個矩陣內選擇乙個子矩陣,其權值等於這個子矩陣中的所有數的最 小值。小 a 想知道,如果他選擇的子矩陣的權值為 i 1 i n m 那麼他選擇 的子矩陣可能有多少種?小 a 希望知道所有可能的...

NKOJ 3860 分隊問題(DP 字首和優化)

問題描述 給定 n 個選手,將他們分成若干只隊伍。其中第 i 個選手要求自己所屬的隊 伍的人數大等於 a i 人。在滿足所有選手的要求的前提下,最大化隊伍的總數。注 每個選手屬於且僅屬於一支隊伍。輸入格式 第一行乙個整數 n,表示人數。以下 n 行,每行乙個整數表示 a i 輸出格式 輸出隊伍總數的...