【題目描述】
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字串很感興趣。一...