51nod1472取餘最大值 分治

2021-08-28 08:34:13 字數 941 閱讀 5690

description

有乙個長度為n的陣列a,現在要找乙個長度至少為2的子段,求出這一子段的和,然後減去最大值,然後對k取餘結果為0。

問這樣的子段有多少個。

sample input

4 31 2 3 4

sample output

3考慮分治,

對於最大值分情況討論一下即可。

#include

#include

using

namespace std;

typedef

long

long ll;

int_max

(int x,

int y)

intread()

while

(ch >=

'0'&& ch <=

'9') s = s *

10+ ch -

'0', ch =

getchar()

;return s * f;

}int n, k, a[

310000];

ll ans, s1[

1100000

], s2[

1100000];

intgg

(ll x)

void

solve

(int l,

int r)

ll cc = mid; maxx =

0, sum =

0; ll uu =

0, ii =0;

for(

int i = mid +

1; i <= r; i++

) maxx = sum =0;

for(

int i = mid; i >= l; i--)}

intmain()

51Nod1472 取餘最大值

題目看這裡 又是乙個七級題目 妥妥的分治啊,列舉右端點,左邊分兩段計數就好啦 關於標解 網上好像很多都是字首和 二分之類的,反正應該差不多快吧 include include include define n 300010 define ll long long using namespace st...

51nod1472 CF549F 取餘最大值

有乙個長度為n的陣列a,現在要找乙個長度至少為2的子段,求出這一子段的和,然後減去最大值,然後對k取餘結果為0。問這樣的子段有多少個。首先有乙個想法,就是建立笛卡爾樹。那麼對於乙個節點,其作為最大值的區間是它的子樹。接下來我們考慮如何計算包含i的有多少個合法區間。對於包含i的 l,r sum r s...

51nod 1402 最大值問題

乙個n長的陣列s 注意這裡的陣列初始下標設為1,而不是0,即n個元素為s 1 s 2 s n 滿足以下性質 1 每個元素都是非負的整數,且s 1 0 2 任意兩個相鄰元素差值的絕對值不大於1,即 s i s i 1 1 3 對於部分特殊點xi,要求s xi ti 這樣的特殊點一共m個 問在以上約束下...