日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

BZOJ3745: [Coci2015]Norma【CDQ】

發布時間:2023/12/15 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ3745: [Coci2015]Norma【CDQ】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

3745: [Coci2015]Norma

我們對于a序列分治,枚舉左端點(從右往左)維護MINMINMINMAXMAXMAX,右端點同時更新兩個指針j,k,表示a[mid+1,j]≤MAXa[mid+1,j] \le MAXa[mid+1,j]MAXMIN≤a[mid+1,k]MIN\le a[mid+1,k]MINa[mid+1,k]

于是右半邊被分成三份。

這里設j&lt;kj&lt;kj<k

1.MIN?MAX?∑t=mid+1j(t?i+1)MIN * MAX * \sum_{t=mid+1}^{j} (t-i+1)MIN?MAX?t=mid+1j?(t?i+1)等差數列求一下就可以了。

2.MIN?∑t=j+1k(min[j+1,t]?(t?i+1))MIN * \sum_{t=j+1}^{k}(min[j+1,t] * (t-i+1))MIN?t=j+1k?(min[j+1,t]?(t?i+1))預處理出min[j+1,t]?tmin[j+1,t] * tmin[j+1,t]?tmin[j+1,t]min[j+1,t]min[j+1,t]的前綴和。

3.∑t=k+1R(min[j+1,t]?max[j+1,t]?(t?i+1))\sum_{t=k+1}^R(min[j+1,t]*max[j+1,t]*(t-i+1))t=k+1R?(min[j+1,t]?max[j+1,t]?(t?i+1))同2

爆精度查了半天QAQ

#include<cstdio> #include<algorithm> using namespace std; const int MOD=1e9,MAXN=500005; int n;long long Ans,a[MAXN],sn[MAXN],snj[MAXN],sm[MAXN],smj[MAXN],snm[MAXN],snmj[MAXN]; #include<cctype> int read(){int ret=0;char ch=getchar();bool f=1;for(;!isdigit(ch);ch=getchar()) f^=!(ch^'-');for(; isdigit(ch);ch=getchar()) ret=(ret<<1)+(ret<<3)+ch-48;return f?ret:-ret; } void Solve(int L,int R){if(L==R){Ans=(Ans+a[L]*a[L]%MOD)%MOD;return;}int mid=(R+L)>>1;Solve(L,mid),Solve(mid+1,R);sn[mid]=snj[mid]=sm[mid]=smj[mid]=snm[mid]=snmj[mid]=0;long long MAX=0,MIN=1<<30;for(int i=mid+1;i<=R;i++){MAX=max(MAX,a[i]),MIN=min(MIN,a[i]);sn[i]=(sn[i-1]+MIN)%MOD;sm[i]=(sm[i-1]+MAX)%MOD;snj[i]=(snj[i-1]+MIN*i%MOD)%MOD;smj[i]=(smj[i-1]+MAX*i%MOD)%MOD;snm[i]=(snm[i-1]+MIN*MAX%MOD)%MOD;snmj[i]=(snmj[i-1]+MIN*MAX%MOD*i%MOD)%MOD;}MAX=0,MIN=1<<30;for(int i=mid,j=mid,k=mid;i>=L;i--){MAX=max(MAX,a[i]),MIN=min(MIN,a[i]);while(j<R&&a[j+1]<=MAX) j++;while(k<R&&a[k+1]>=MIN) k++;int x=min(j,k),y=max(j,k);Ans=(Ans+MAX*MIN%MOD*(1ll*(mid-i+x-i+3)*(x-mid)/2%MOD))%MOD;Ans=(Ans+(snmj[R]-snmj[y]-(snm[R]-snm[y])*(i-1)%MOD)%MOD+MOD)%MOD;if(k<j) Ans=(Ans+MAX*(snj[y]-snj[x]-(sn[y]-sn[x])*(i-1)%MOD)%MOD+MOD)%MOD;else Ans=(Ans+MIN*(smj[y]-smj[x]-(sm[y]-sm[x])*(i-1)%MOD)%MOD+MOD)%MOD;} } int main(){n=read();for(int i=1;i<=n;i++) a[i]=read();Solve(1,n);printf("%lld\n",Ans);return 0; }

總結

以上是生活随笔為你收集整理的BZOJ3745: [Coci2015]Norma【CDQ】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。