1. 程式人生 > >JZ模擬賽 8.18

JZ模擬賽 8.18

2個 blank net 提取 訪問 pan targe href sdn

A組:

T1:

string

Description

給定一個由小寫字母組成的字符串 s。有 m 次操作,每次操作給 定 3 個參數 l,r,x。如果 x=1,將 s[l]~s[r]升序排序;如果 x=0,將 s[l]~s[r] 降序排序。你需要求出最終序列。

Data Constraint

對於 40%的數據,n,m<=1000。
對於 100%的數據,n,m<=100000

Solution:

註意到,只有26個字符。用一個線段樹,維護區間a~z的個數。

每次操作,求出總共的a個數,b個數。。。。z個數。

26次區間修改即可。把前k1個變成a,k1+1到k1+k2個變成b.....

T3:

number

Description

給定正整數 n,m,問有多少個正整數滿足: (1)不含前導 0; (2)是 m 的倍數; (3)可以通過重排列各個數位得到 n。

Data Constraint

對於 20%的數據,n<10^10。
對於 50%的數據,n<10^16,m<=20。
對於 100%的數據,n<10^20,m<=100。

直接數位dp。但是(3)條件還要記錄出現了哪些數字。很麻煩。

n<=20,直接bool記錄這個位置的數有沒有出現過,2^20肯定不行。

如果記錄0~9每一個數出現次數,以出現次數最多的數的個數為進制數呢?顯然,很多狀態都是沒有用的。

還是會被卡到10^10更慘。

zyz:變進制法,1~9開一個桶,有多少個數,就是幾進制。那麽一個狀態S就代表:k0+ k1*num0+k2*num0*num1+...k9*(num0*...*num8)

ki表示,i這個數在狀態中出現的次數。numi表示,原來n中,i出現的次數。

轉移,提取i這一位,S%∏(num0~i)/∏(num0~i-1) (類似一般10進制的取法)

如果能多取,i多取了一個,轉移到S+i*∏(num0~i-1)

變進制法不錯的講解:NKOJ1633 神仙開山【變進制數狀壓DP】

這樣,很多多余的狀態就都壓進去了。總共不到2000個狀態。

我的做法:暴力找到所有可能的情況,暴力n^2判斷能否相互轉移。給每個情況開一個vector啥的。轉移直接訪問vector

反正2000的情況,也能過,就是不優美。

B組:

T1:

Description

雞腿是CZYZ的著名DS,但是不想學數學的DS不是好GFS,所以雞腿想通過提高數學水平來增強他的GFS氣質!雖然你對雞腿很無語,但是故事的設定是你幫助雞腿增強了GFS氣質,所以現在你必須教雞腿學數學!

雞腿想到了一個很高(sha)明(bi)的問題,在 N 條水平線與 M 條豎直線構成的網格中,放 K 枚石子,每個石子都只能放在網格的交叉點上。問在最優的擺放方式下,最多能找到多少四邊平行於坐標軸的長方形,它的四個角上都恰好放著一枚石子。

Data Constraint

對於50%的數據0 < N, M ≤ 30;

對於100%的數據0 < N, M ≤ 30000;K ≤ N*M。

rectangle:顯然k個點必定擺成以下兩種情況可能最優:

XXX...XXX

XXX...XXX

.

.

.

XXX...XXX

X..X

XXX...XXXX

XXX...XXX.

. .

. .

. .

XXX...XXX

所以只要枚舉一行的個數(或者一列的個數)。

假設第一種情況除了最後一行每行都是i個,那麽矩形的個數就是C(k/i,2)*C(i,2)+C(k%i,2)*k/i,第二種情況同理。

 (來自題解)

JZ模擬賽 8.18