簡單的區間

2021-10-08 19:14:32 字數 2491 閱讀 4486

簡單的區間 本題其

實是典型

的分治的

做法

本題其實是典型的分治的做法

本題其實是典

型的分治

的做法

對 於每

乙個[l

,r],

我們找出

最大值的

位置po

s,然後

掃瞄[l

,pos

−1]與

[pos

+1,r

]中較短

的一段,

然後求出

在另一段

所需要的

值的個數

,加入答

案就行了

對於每乙個[l,r],我們找出最大值的位置pos,然後掃瞄[l,pos-1]與[pos+1,r]中較短的一段,然後求出在另一段所需要的值的個數,加入答案就行了

對於每乙個[

l,r]

,我們找

出最大值

的位置p

os,然

後掃瞄[

l,po

s−1]

與[po

s+1,

r]中較

短的一段

,然後求

出在另一

段所需要

的值的個

數,加入

答案就行

了 具 體來

說具體來說

具體來說 1.先對

s求字首

和,(前

綴和對k

取模),

然後加入

桶裡

1. 先對s求字首和,(字首和對k取模),然後加入桶裡

1.先對s求

字首和,

(字首和

對k取模

),然後

加入桶裡

2. 原式

可以轉換

成(su

m[r]

−sum

[l−1

]−s[

pos]

+k)m

odk=

0,(s

[pos

]為[l

,r]的

最大值)

2.原式可以轉換成(sum[r]-sum[l-1]-s[pos]+k)mod \ k=0,(s[pos]為[l,r]的最大值)

2.原式可以

轉換成(

sum[

r]−s

um[l

−1]−

s[po

s]+k

)mod

k=0,

(s[p

os]為

[l,r

]的最大

值)3. 在桶

中找出需

要的答案

3.在桶中找出需要的答案

3.在桶中找

出需要的

答案陣列注意要開得足夠大

#include

using

namespace std;

typedef

long

long ll;

const ll n=

3e5+

5,m=

1e6+5;

ll ans,n,k,sum[n]

,a[n]

;ll lg[n]

,st[n][20

];vector myline[m]

;ll get_sum

(ll llll,ll rrrr,ll val)

ll get_mx

(ll lll,ll rrr)

ll get_

(ll lll,ll rrr)

else lll=mid+1;

}return lll;

}ll get_ans

(ll l,ll r)

ll anss=0;

ll pos=

get_

(l,r)

; anss+

=get_ans

(l,pos-1)

,anss+

=get_ans

(pos+

1,r);if

(r-pos>pos-l)

else

return anss;

}signed

main()

for(ll i=

1;i<=n;i++

)for

(ll i=

1;i) myline[0]

.push_back(0

);for(ll i=

1;i<=n;i++

)int up=lg[n]

;for

(ll len=

2;len<=up;len++)}

ans=0;

ans=

get_ans(1

,n);

printf

("%lld"

,ans)

;}

簡單的區間 dp

今天我們來一起研究一下比較奇怪的區間dp 先看一道例題 石子合併 很老的題了 1960 石子合併 time limit 1 sec memory limit 128 mb submit 191 solved 78 submit status web board description 在乙個圓形操場...

簡單的區間覆蓋問題

問題描述 用i表示 x軸上座標為 i 1,i 的區間 區間長度為 1 並給出 m個不同的整數來表示 m個這樣的區間。現在要求畫出幾條線段覆蓋住所有的區間,條件是 每條線段可任意長,但要求所畫線段長度之和最小,並且線段的數目不超過n。分析 1 整型陣列p m 表示所有從0開始的區間長度,假設p m 已...

簡單區間問題 貪心

萌新在這裡記錄一下 a.不重疊的線段 51nod 1133 最基礎的區間問題 也就是 挑戰 一書中p41貪心提到的區間問題 選取最多的工作數目 tips 題意就不說了8 貪心的思想,工作結束的越早 線段的右端點越小 越對後面的影響小。要注意端點可不可以重合,每個題要求不一樣 include usin...