列舉優化 優美的序列

2021-09-03 03:34:54 字數 1844 閱讀 3933

【題目描述】

l喜歡序列(明顯吃飽了沒事幹 ),他最近在研究乙個優美的序列。假設有乙個長度是n的序列,對於區間[l,r],當且僅當存在k∈[l,r],對於任意i∈[l,r],滿足ak | ai,也就是區間裡存在乙個數字是該區間所有數的約數。

l想知道最長的優美區間是多少。(想知道?不告訴你! )

30%資料:n<=30,1<=ai<=32

60%資料:n<=3000,1<=ai<=1024

80%資料:n<=300 000,1<=ai<=104876

100%資料:1<=n<=500 000,1<=ai<2^31

【輸入】

第一行是乙個整數n

第二行是n個整數ai

【輸出】

第一行2個數字,m和l,表示最長的優美區間的個數,以及他們的右端點減左端點的值

接下來是一行m個數字,按公升序輸出這些最長優美區間的左端點

【樣例輸入】

54 6 9 3 6

【樣例輸出】

1 32

最怕考試遇見題目描述很短的題。

這道題正解似乎是乙個叫單調棧的東東。這種東西蒟蒻我當然是想不到的(不知道誰吃多了能想到 ),因此我採取了最簡單最粗暴最單純的做法——列舉。逐個列舉每個點能到達的最左和最右位置,用l和r陣列記錄一下,再來比較就可以啦。顯然,直接列舉是過不了的,但是我們可以有乙個顯而易見的 優化。這裡以列舉第i個數最左能影響的位置為例:當a[i]是a[j]的約數時(j顯然l[j]更小 ),再繼續向左拓展,否則停止拓展當前數,開始拓展下乙個數。向右拓展也是同樣的方法(向右拓展=向左拓展+ctrl c+ctrl v )。

**:(忽略第一句注釋 )

//枯藤老樹昏鴉,小橋流水人家。 

#include

#include

#include

#include

#include

#include

#include

#define re register

#define lc (id<<1)

#define rc (id<<1|1)

using

namespace std;

int n,m,a[

500001

],b,c,l[

500001

],r[

500001];

int ans=-1

;int lm[

500001];

//記錄最長長度的左端點

int vis[

500001];

//判重陣列

intmain()

}for

(int re i=n;i>=

1;i--)}

for(

int re i=

1;i<=n;i++

) ans=

max(ans,r[i]

-l[i]);

for(

int re i=

1;i<=n;i++)}

sort

(lm+

1,lm+m+1)

;printf

("%d %d\n"

,m,ans)

;for

(int i=

1;i<=m;i++

)return0;

}

最後執行速度竟然比二分還快,不比單調棧慢但是思維難度降低了不少 。所以說暴力出奇蹟。然而這改變不了我考試的時候忘記判重而爆零的事實。

其實這個方法本質上和單調棧是一樣的。

優美的閃電

一開始的思路是 當前剩餘權值最大的那個區間一定要被一發能 量為該區間權值的飛彈打掉,所以我們列舉該飛彈擊打位置,同 時我們刪除所有能被該飛彈擊打掉的區間,但是這只針對樣例,對於題目的其他資料就是不成立的。正確的是使用區間 dp,fi,j 表示座標被 i,j 完全包含 的區間最小需要花費的能量。則可以...

優美的句子

只言片語,溫暖人心 不亂於心,不困於情。如此,安好。不開心時,記得要讓心情轉個彎。出發去拾起,夢裡車輪碾過的風景。晨鐘淡淡,喚起一天的生機。丟掉煩惱,日子才能風輕雲淡。打足精神,讓今天成為最棒的一天。分享快樂,福己及人。皓月當空,清風徐徐,盡情享受。回首忙碌日,假期更顯貴。開心了就笑,不開心就過會再...

優美的01串

1002 優美的01串 time limit 1 sec memory limit 128 mb 64bit io format lld submitted 519 accepted 182 submit status web board description 最近,byte對01字串很感興趣。一...