51Nod1472 取餘最大值

2021-08-22 00:15:25 字數 838 閱讀 9279

題目看這裡

又是乙個七級題目

妥妥的分治啊,列舉右端點,左邊分兩段計數就好啦~

關於標解:

網上好像很多都是字首和+二分之類的,反正應該差不多快吧

#include

#include

#include

#define n 300010

#define ll long long

using namespace std;

ll s=0;

int v[n],s[n],c[n*4],c2[n*4],mx[n],n,m,wx[n];

inline void cdq(int l,int r)

intm=l+r>>1; cdq(l,m); cdq(m+1,r);

s[l-1]=0;

for(int i=l;i<=m;++i) s[i]=(s[i-1]+v[i])%m;

s[m+1]=v[m+1]%m; mx[m+1]=v[m+1];

for(int i=m+2;i<=r;++i)

mx[m]=v[m];

++c2[((s[m]-s[m-1]-mx[m])%m+m)%m];

for(int i=m-1;i>=l;--i)

for(int i=m,j=m+1;j<=r;++j)

s+=c[(m-s[j]+mx[j]+m)%m];

s+=c2[(m-s[j]+m)%m];

}for(int i=l;i<=m;++i) c[(s[m]-s[i-1]+m)%m]=c2[((s[m]-s[i-1]-mx[i])%m+m)%m]=0;

}int main()

51nod1472取餘最大值 分治

description 有乙個長度為n的陣列a,現在要找乙個長度至少為2的子段,求出這一子段的和,然後減去最大值,然後對k取餘結果為0。問這樣的子段有多少個。sample input 4 31 2 3 4 sample output 3考慮分治,對於最大值分情況討論一下即可。include incl...

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