jzoj5231 序列問題 分治

2021-09-10 06:50:54 字數 2087 閱讀 8083

n

nn個數字,求

( ∑l

=1n∑

r=ln

min∗

max(

i∈[l

..r]

))%(

109+

7)

(\sum_^n\sum_^nmin\*max\(i\in [l..r]))\%(10^9+7)

(l=1∑n

​r=l

∑n​m

in∗m

ax(i

∈[l.

.r])

)%(1

09+7

)考慮分治,單獨在半個內的分治下去計算,考慮如何計算跨過中點的區間。

有兩種情況:

m in

smins

mins

和m ax

smaxs

maxs

全部在一邊。

這時我們可以列舉一邊的指標,然後因為min

smins

mins

和m ax

smaxs

maxs

都滿足單調性,所以另一半邊滿足的區間範圍也滿足單調性,之間指標掃過去

m in

smins

mins

和m ax

smaxs

maxs

在不同邊

列舉右邊指標,然後兩個指標在左邊表示滿足的區間的範圍限制。之後用字首和優化計算

時間複雜度o(n

logn

)o(n\ log\ n)

o(nlog

n)

#include

#include

#define n 500010

#define ll long long

using

namespace std;

const ll xjq=

1e9+7;

ll ans,n,m;

ll mi[n]

,mx[n]

,a[n]

,sum[n]

;void

dg(ll l,ll r)

if(l>r)

return

; ll mid=

(l+r)/2

; mi[mid+1]

=mx[mid+1]

=a[mid+1]

; mi[mid]

=mx[mid]

=a[mid]

;for

(ll i=mid+

2;i<=r;i++

) mi[i]

=min

(a[i]

,mi[i-1]

),mx[i]

=max

(a[i]

,mx[i-1]

);for(ll i=mid-

1;i>=l;i--

) mi[i]

=min

(a[i]

,mi[i+1]

),mx[i]

=max

(a[i]

,mx[i+1]

);j=mid;

for(ll i=mid+

1;i<=r;i++

) j=mid+1;

for(ll i=mid;i>=l;i--

) sum[l-1]

=0;for

(ll i=l;i<=mid;i++

) sum[i]

=sum[i-1]

+mi[i]

; j=mid;k=mid;

for(ll i=mid+

1;i<=r;i++

)for

(ll i=l;i<=mid;i++

) sum[i]

=sum[i-1]

+mx[i]

; j=mid;k=mid;

for(ll i=mid+

1;i<=r;i++)dg

(l,mid);dg

(mid+

1,r);}

intmain()

JZOJ 3889 序列問題 dp

傳送門 在乙個序列中選出兩個集合s ss和t tt,使得s ss中的每個數異或起來等於t tt中 的每個數與起來 設f i,j,k 0.2 f fi j,k 0.2 表示做到第i ii個數,結果為j jj的方案數,k 0 k 0k 0表示在此之前並沒有任何操作,k 1 k 1k 1表示已經開始與操作...

Jzoj5431 序列操作

一開始有n個非負整數h i 1 i n 接下來會進行m次操作,第i次操作給出乙個數c i 要求你選出c i 個大於零的數並將它們減去1。問最多可以進行多少輪操作後無法操作 即沒有c i 個大於零的數 考場上腦抽認為先減小的會更優 很明顯先減大的會更優啊!考慮怎麼維護,可以用splay 然而正常人都用...

Jzoj5431 序列操作

一開始有n個非負整數h i 1 i n 接下來會進行m次操作,第i次操作給出乙個數c i 要求你選出c i 個大於零的數並將它們減去1。問最多可以進行多少輪操作後無法操作 即沒有c i 個大於零的數 考場上腦抽認為先減小的會更優 很明顯先減大的會更優啊!考慮怎麼維護,可以用splay 然而正常人都用...