題目鏈結
這道題最基本的想法就是一次尋找每個區間,對於每個區間,用二分來判定其最大長度。每次check的時候,對區間排序,不斷取出不大於m對最大值與最小值求值即可。
然後你就喜提tle了,笑如果用倍增來代替二分的話能過,不過其實倍增最壞複雜度和二分一樣,應該是資料沒有刻意來卡倍增。下面先給出倍增的**。
const int maxn = 5e5+10;
int t,n,m,arr[maxn],tmp[maxn]; ll t;
ll check(int l, int r)
++ans;
st = ed;
}printf("%d\n",ans);
}return 0;
}
我們在倍增的時候發現乙個問題,每次列舉區間的時候,它的長度都是在遞增的,而我們每次check都重複的對區間前部進行的排序,所以就有了優化空間。
我們可以每次只對新增的部分排序,因為前面的部分有序,所以就可以像歸併排序那樣講兩段區間合併成乙個區間,這樣減少了排序長度,就能獲得更快的速度。
const int maxn = 5e5+10;
int t,n,m,arr[maxn],tmp[maxn],tmp2[maxn]; ll t;
bool check(int l, int r, int len)
++ans;
st = ed;
}printf("%d\n",ans);
}return 0;
}
AcWing 109 天才ACM 倍增 歸併
給定乙個整數 mm,對於任意乙個整數集合 ss,定義 校驗值 如下 從集合 ss 中取出 mm 對數 即 2 m2 m 個數,不能重複使用集合中的數,如果 ss 中的整數不夠 mm 對,則取到不能取為止 使得 每對數的差的平方 之和最大,這個最大值就稱為集合 ss 的 校驗值 現在給定乙個長度為 n...
唯一天才挽救不了AC公尺蘭沒落
在幾天前,義大利各大 還在盛讚卡卡是新一代的 球王 是本屆歐洲金球獎的有力競爭者,但緊跟著ac公尺蘭就輸球了,擁有天才球員卡卡,但不代表擁有勝利,畢竟足球是11個人的比賽,乙個卡卡,無法挽救落難的ac公尺蘭。僅僅是擁有乙個巨星的球隊是無法成功的,否則當年擁有羅納爾迪尼奧的巴黎聖日耳曼就不會一無所獲了...
SDOI2017 天才黑客
我們不妨思考一下,兩個串的 lcp 的長度在 trie 樹上是什麼?對應點的 lca 的深度。然後就可以想到把邊看成點,然後把邊與邊之間連邊,點權看成這條邊經過所需要的時間。但是這樣子連邊是 o m 2 的,不夠優秀。我們需要進一步優化。考慮兩個點之間的 lcp 可以用什麼來代替?sa 裡面的 he...