題目看這裡
又是乙個七級題目
妥妥的分治啊,列舉右端點,左邊分兩段計數就好啦~
關於標解:
網上好像很多都是字首和+二分之類的,反正應該差不多快吧
#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個 問在以上約束下...