hihocode 1488 排隊接水 莫隊演算法)

2021-07-29 17:15:39 字數 1135 閱讀 6241

時間限制:

10000ms

單點時限:

1000ms

記憶體限制:

256mb

有n個小朋友需要接水,其中第i個小朋友接水需要ai分鐘。

由於水龍頭有限,小hi需要知道如果為第l個到第r個小朋友分配乙個水龍頭,如何安排他們的接水順序才能使得他們等待加接水的時間總和最小。

小hi總共會有m次詢問,你能幫助他解決這個問題嗎?

假設3個小朋友接水的時間分別是2,3,4。如果他們依次接水,第一位小朋友等待加接水的時間是2,第二位小朋友是5,第三位小朋友是9。時間總和是16。

第一行乙個數t(t<=10),表示資料組數

對於每一組資料:

第一行兩個數n,m(1<=n,m<=20,000)

第二行n個數a1...an,表示每個小朋友接水所需時間(ai

<=20,000)

接下來m行,每行兩個數l和r

對於每次詢問,輸出一行乙個整數,表示答案。

樣例輸入

1

4 21 2 3 4

1 22 4

樣例輸出

4

16

思路:多區間的問題莫隊演算法是很好的解決方式,通過排序,使得區間增加減少的最少,然後只需要求出[l,r]轉移到[l+1,r],[l-1,r],[l,r-1],[l,r+1],四個轉移方程式即可在nsqrt(n)的時間複雜度求出所有的查詢區間。

此題中新加入乙個數,我們只需要求出小於等於此數的和和大於此數的個數即可算出這個數加進去之後對答案的貢獻度。

**:#includeusing namespace std;

typedef long long ll;

const int maxn=100000+5;

int a[maxn];

int cnt[1<<20];

ll result;

ll ans[maxn],bit1[maxn],bit2[maxn];

int unit,n,m,k;

struct query

query[maxn];

bool cmp( query a,query b )

while( l>query[i].l )

while( l

2956 排隊問題

題目描述 description 有n個學生去食堂,可教官規定 必須2人或3人組成一組,求有多少種不同分組的方法。輸入描述 input description 乙個數,n 輸出描述 output description 乙個數,即答案。樣例輸入 sample input 6 樣例輸出 sample ...

281 排隊布局

當排隊等候餵食時,奶牛喜歡和它們的朋友靠近些。fj 有n頭奶牛,編號從1到n,沿一條直線站著等候餵食。奶牛排在隊伍中的順序和它們的編號是相同的。因為奶牛相當苗條,所以可能有兩頭或者更多奶牛站在同一位置上。如果我們想象奶牛是站在一條數軸上的話,允許有兩頭或更多奶牛擁有相同的橫座標。一些奶牛相互間存有好...

281 排隊布局

281.排隊布局 描述提交 自定義測試12 3 題目描述 當排隊等候餵食時,奶牛喜歡和它們的朋友靠近些。fj 有n頭奶牛,編號從1到n,沿一條直線站著等候餵食。奶牛排在隊伍中的順序和它們的編號是相同的。因為奶牛相當苗條,所以可能有兩頭或者更多奶牛站在同一位置上。如果我們想象奶牛是站在一條數軸上的話,...