簡單的區間 本題其
實是典型
的分治的
做法
本題其實是典型的分治的做法
本題其實是典
型的分治
的做法
對 於每
乙個[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...