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
∑nm
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 然而正常人都用...