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個 問在以上約束下...