HDU 6103 Kirinriki 尺取好題

2021-10-10 14:16:22 字數 1233 閱讀 8931

傳送門

開始一直不知道怎麼寫

但是可以列舉a

aa串的右端點和b

bb串的左端點

然後可以一直把a

aa串向左擴充套件,b

bb串向右擴充套件

而且因為dis

disdi

s是個單增函式,所以一旦大於m

mm就可以直接跳出

但這樣沒有優化複雜度,仍然是o(n

3)

o(n^3)

o(n3)

究其原因,是因為列舉端點就花了o(n

2)

o(n^2)

o(n2)

但是對於a串和b串,如果a串向右延伸,b向左延伸

最後會交於他們的對稱軸,我們可以列舉這根對稱軸

設對稱軸左邊是mid

midmi

d,對稱軸右邊是mid

+1

mid+1

mid+1

那麼當前a串區間是[mi

d,mi

d]

[mid,mid]

[mid,m

id],b串區間是[mi

d+1,

mid+

1]

[mid+1,mid+1]

[mid+1

,mid

+1]

如果要維持對稱軸不變,要麼a左端點左移乙個長度,b右端點右移乙個長度

要麼a右端點左移乙個長度,b左端點右移乙個長度

那 麼這

樣就是一

個尺取的

過程,因

為dis

是乙個不

減函

數\color那麼這樣就是乙個尺取的過程,因為dis是乙個不減函式

那麼這樣就是

乙個尺取

的過程,

因為di

s是乙個

不減函式

#include

using

namespace std;

const

int maxn =

5009

;char s[maxn]

;int t,n,m;

void

solve

(int i,

int x,

int&ans)

else

//太大了,縮小 }}

intmain()

}

HDU 6103 列舉 尺取

題意 給出乙個字串,問兩個不相交的字串對稱相減的絕對值和小於等於 m的最長長度。思路 如果存在兩個不相交的字串,那麼必然兩個字串之間存在對稱軸,分為兩種 1.子串之間有奇數個其它字元,那麼列舉其中的字元。2.子串之間有偶數個其它字元,那麼列舉其中的空格。對稱軸確定之後,對對稱的串計算出其對稱相減的和...

HDU 4334 尺取 思維

題意 在5個陣列中,每個陣列中取乙個數,5個數之和是否為0 第一次我是用map標記前3個陣列的和,然後暴力跑後兩個陣列的迴圈,果然t了。網上又兩種做法 處理前三個陣列的和,後兩個陣列的和,排序 列舉 二分。我自己沒試過不知道能過不 t n 3 n 2 log n 3 log n 2 n 2 log ...

HDU 6231 (二分 尺取)

所求的一定是a陣列中的原素,這點毋庸置疑,所以在a陣列中任意選則其中的乙個數x,若a的所有長度不小於k的連續子串行中第k大數不小於x的子串行一共有ans個,那麼x在所有第k大元素組成的數列中至少是第ans大數 因為ans n r,因為之前的x已經是第k大了,所以加上後面的元素,如果比他小,則沒有影響...