JZOJ5775 農夫約的假期 模擬

2022-09-03 05:00:12 字數 3505 閱讀 9374

題目:

在n×nn×n

的矩形中找出乙個點,使得這個點到其他標記點曼哈頓距離加上標記點的權值之和最小。101

0分做法:n≤

10n≤1

0列舉這個矩陣的每乙個點,再列舉每乙個標記點,求出曼哈頓距離,取最小值即可。

或者從每個標記點跑bfs

bfs。

時間複雜度:o(n

4)o(

n4)10分**

30分做法:n≤

1000n≤

1000

假設這個圖是這樣子的(黃色點是標記點):

可以把第三行的所有點和第一行的特殊點的曼哈頓距離連一下看看。

會發現,它們向下的距離(藍色部分)是一樣的!

同理,下面的標記點也一樣。

所以,任何乙個特殊點到同一行的點的曼哈頓距離中經過的列數是一樣的。

同理,所有的特殊點到同一列的點的曼哈頓距離中經過的行數是一樣的。

那麼我們設h[i

]h[i

]表示所有特殊點到這一行的點曼哈頓距離經過的列數,l[i

]l[i

]表示所有特殊點到這一列的點曼哈頓距離經過的行數。

那麼我們就先初始化出每行每列的特殊點的個數,然後o(n

2)o(

n2)列舉任意兩行,求出第j

j行的特殊點到第i

i行的所有點的曼哈頓距離的列數(同理也要列舉任意兩列)

最後可以o(n

2)o(

n2)列舉所有點,蔬輸出最小的那乙個。

30分**

100100

分做法:o(

n)o(

n)考慮如何在30分的做法上優化。跳過了30分的朋友建議回去再可以下30分的做法。

我們可以發現,第i

i行的點到所有特殊點的曼哈頓距離之和是可以通過第i−1

i−1行的點得到的。如果能o(1

)o(1

)轉換,那麼就可以了。

首先,很容易發現:h[

i]=h

[i−1

]+在第

i−1行

上面的特

殊點數量

−在第i

行下面的

特殊點數

量h[i

]=h[

i−1]

+在第i

−1行上

面的特殊

點數量−

在第i行

下面的特

殊點數量

那麼如果能o(1

)o(1

)知道在任意一行上面的點的數量和下面的點的數量就可以o(1

)o(1

)轉化。

所以可以求乙個字首和,hs[

i]hs

[i]表示在第i

i行(含)之前的特殊點數量,那麼就有hs

[i]=

hs[i

−1]+

hnum

[i]h

s[i]

=hs[

i−1]

+hnu

m[i]

知道了上面的特殊點數量,那麼下面的特殊點數量就一目了然了。

那麼就可以先o(n

)o(n

)求出第一行的點到所有特殊點的曼哈頓距離,然後就可以推出每一行到特殊點的距離。

列也同理,可以o(n

)o(n

)求出。

那麼我們就做到了:

那麼就只剩下最後乙個o(n

2)o(

n2)的地方了:輸出。

我們可以o(n

)o(n

)知道所有行的最小列曼哈頓距離,又可以o(n

)o(n

)知道所有列的最小曼哈頓距離,那麼這兩行的交點就是到所有標記點曼哈頓距離最短的點!

;//字首和

for(ll i=

1;i<=n;i++

) h[1]

+=(hnum[i]

*abs

(i-1

)*z)

;for

(ll i=

1;i<=n;i++

) l[1]

+=(lnum[i]

*abs

(i-1

)*z)

;//求出第一行第一列

for(ll i=

2;i<=n;i++

) h[i]

=h[i-1]

+hs[i-1]

*z-(m-hs[i-1]

)*z;

for(ll i=

2;i<=n;i++

) l[i]

=l[i-1]

+ls[i-1]

*z-(m-ls[i-1]

)*z;

//往後轉移

minn=

1e16

;for

(ll i=

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

(h[i]

//找最小的行

minn=

1e16

;for

(ll i=

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

(l[i]

//找最小的列

cout<

+l[y]

+sum<<

"\n"

<

" "<

return0;

}

577 員工獎金

選出所有 bonus 1000 的員工的 name 及其 bonus。employee 表單 bonus 表單 輸出示例 題目條件 mysql drop table ifexists bonus create table bonus empid int 11 notnull bonus int 11...

mysql 5 7 7以後需要初始化資料庫

用zip包的形式在windows上安裝了mysql 5.7.10,在啟動服務的時候,總是提示無法啟動服務,說是服務沒有報告任何錯誤。從windows的事件管理器中可以看到錯誤資訊 fatal error can t open and lock privilege tables table mysql...

JZOJ 交換 模擬

給出字串s和字串t,現在你要把s的某乙個字元和t的某乙個字元交換,使得交換之後的s至少要有三個連續相同的字元,交換之後的t也要有三個連續相同的字元。問有多少種不同的交換方式。第一行,乙個字串s。s只含有 r g b 三種字元,長度不超過50,不小於3。而且s任意兩個相鄰的字元都不相同。第二行,乙個字...