傳送門 to luogu
這思路真是絕了……我不知道該怎麼說。
注意到左端點需要最小,所以我們一來先猜 l=1
l=1l=
1 。假如我們求出乙個最小的 r
rr 使得 [l,
r]
[l,r]
[l,r
] 中所有數的和超過 k
kk ,那麼這個和最多是k+1
k+1k+
1 。同時,如果說 [l,
r]
[l,r]
[l,r
] 中所有數的和為 k+1
k+1k+
1 ,那麼 [l,
r−1]
[l,r-1]
[l,r−1
] 的和一定是 k−1
k-1k−
1 。故 ar=
2a_r=2
ar=
2 。此時我們考慮將l
ll增大一。如果 al=
1a_l=1
al=
1 那麼 [l+
1,r]
[l+1,r]
[l+1,r
] 已經是答案了。否則 [l+
1,r+
1]
[l+1,r+1]
[l+1,r
+1] 的和是不小於 k
kk 的。什麼情況下這個和是 k+1
k+1k+
1 呢?就是 ar+
1=
2a_=2
ar+1=
2 的時候。
可以看到,乙個區間 [l,
r]
[l,r]
[l,r
] 在滿足 ar=
2a_r=2
ar=
2 且 k−1
=∑i=
lr−1
ai
k-1=\sum_^a_i
k−1=∑i
=lr−
1ai
時,可以分成三種情況:
顯然只有一種情況要遞迴,我們只要能將其加速就好了。這種情況我們只需要問,l/r
l/rl/
r 開始的連續的 2
22 有多少個?可以樹狀陣列(或者線段樹)上二分。求出第乙個 r
rr 同樣方法。複雜度 o[(
n+m)
logn]
\mathcal o[(n+m)\log n]
o[(n+m
)logn]
。
#include
#include
#include
#include
using
namespace std;
typedef
long
long int_;
inline
intreadint()
inline
intqkpow
(int_ b,int_ q,
int mod)
const
int maxn =21;
int bit[
1<, n, m, a[
1<;void
modify
(int id,
int x)
intquery
(int id)
/** @return min_ x*/
intfinds
(int s)
/** @return max_ x */
intcounttwo
(int id)
char zhihucuan[
1<<10]
;int
main()
if(opt ==
'a')if(
query
(r)== s)
if(a[1]
==1)int cnt1 =
counttwo(1
);int cnt2 =
counttwo
(r);
if(cnt1 < cnt2-r+1)
// 遇到了可以去頭的地方!
printf
("%d %d\n"
,cnt1+
2,r+cnt1)
;else}}
return0;
}
洛谷 P6859 蝴蝶與花
洛谷傳送門 amazing john 做了乙個夢,夢到他上輩子是只蒼茫蝶。深壑幽蘭,雨落蒼茫。憐其折翅,苦其執魔。瓊片織翼,花露餞行。伶仃蝶碎,蘭枯有情。君不識妾,妾仍思君。amazing john 很喜歡花。amazing john 的花圃裡有 nn 朵花,他每天都會在花園裡散步。對於每一朵花 a...
P6859 蝴蝶與花 思維 資料結構優化
給定乙個 12 串,問能否找到 l 最小的區間 l,r 使得 sum l,r 恰好等於 s 過程中可以修改單點,修改後也只能是 1或者2 串的長度 n m 次詢問 對每個詢問若有合法方案輸出這個方案的 l,r 否則輸出 none 1 leq n m leq 2 times 10 6 0 leq s ...
擺花 洛谷p1077
小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共m盆。通過調查顧客的喜好,小明列出了顧客最喜歡的n種花,從1到n標號。為了在門口展出更多種花,規定第i種花不能超過ai盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。試程式設計計算,一共有多少種不同的擺花方案。...