2015 復活 Hopscotch CDQ分治

2021-07-05 23:15:04 字數 2562 閱讀 9218

給定乙個 n 行 m 列的方格,每個格仔裡有乙個正整數 a,1 ≤ a ≤ k, k ≤ n ∗ m

假設你當前時刻站在 (i, j) 這個格仔裡,你想要移動到 (x, y),那必須滿足以下三個條件

1:i < x

2:j < y

3:第 i 行第 j 列格仔裡的數不等於第 x 行第 y 列格仔裡的數

求從 (1, 1) 移動到 (n, m) 的不同的方案數

第一行三個數 n, m, k

接下來 n 行每行 m 個正整數,表示每個格仔裡的數

一行乙個數,表示從 (1, 1) 移動到 (n, m) 的不同的方案數,模 10 9 + 7

hopscotch.in

4 1

1 1

1 4

1 3

2 1

4 1

2 4

1 hopscotch.out

5 1

1 1

1• 對於 20% 的資料,n, m ≤ 20。

• 對於 60% 的資料,n, m ≤ 100。

• 對於 100% 的資料,n, m ≤ 750。

這道題rpeng曾經講過,做法有很多,可持久化,雜湊+資料結構都可以做,在這裡介紹乙個利用cdq分治的做法。

首先,我們考慮乙個60分的做法 fi

,j=∑

fk,l

(xi,

j≠xk

,l)

將這個式子轉化為 fi

,j=∑

fk,l

−∑fp

,q(k

lxi,j

=xp,

q)這樣題目就只需要快速的統計兩個部分和,這就為優化轉移提供了可能

我們發現,這個dp是自上而下的,第i行的狀態需要從前i-1行轉移過來,而第i行對前i-1行均不造成影響,這樣就可以使用cdq分治

我們在這裡對行分治,用work(up,down)表示處理up~down區間。那我們最後要的得到的就是work(1,n)

當work(up,down)時,mi

d=(l

+r)/

2 ,我們假設l~mid已經計算完畢,則可以用l~mid更新mid+1~down。我們不難想到用su

m 表示l~mid中的部分和,用sk

表示∑f

i,j(

xi,j

=k) ,用fi

,j表示到達(i

,j) 的方案數,然後用下圖的順序進行更新。

其中在奇數區域中,我們更新

f 陣列,在偶數區域中,更新su

m和s 陣列

那mid+1~down-1怎麼轉移到down呢?這裡我們可以繼續向下回溯,用work(mid+1,r)繼續更新。

在每一層的更新中,s陣列都需要清零。但若每次都memset肯定會超時。怎麼辦呢?可以用乙個時間戳,給每乙個xi

,j記乙個dfn

xi,j

,當進入新的一層的更新時,將time_clock加一,在更新時,若發現sx

i,j≠

time

_clo

ck則將sx

i,j 清零並將fi

,j加入

最後分析時間複雜度。同一層分治中,每個區間只會被更新一次,所以每一層分治的總複雜度都是nm

,而分治的層數不會超過lo

g2n 層,所以總的時間複雜度是o(

nmlo

g2n)

完美解決了這個問題

#include
using

namespace

std;

#define rep(i, a, b) for(int i = (a); i <= (b); i++)

#define red(i, a, b) for(int i = (a); i >= (b); i--)

#define ll long long

const ll mod = 1000000007;

const

int n = 800;

const

int s = n * n;

ll x[n][n], f[n][n];

ll dfn[s], s[s];

int n, m, time_clock, num;

ll k;

inline ll read()

return x;

}void work(int l, int r)

f[i][j] = (f[i][j] + num - s[x[i][j]] + mod) % mod;

}rep(i, l, mid)

s[x[i][j]] = (s[x[i][j]] + f[i][j]) % mod;

num = (num + f[i][j]) % mod;}}

work(mid + 1, r);

}int main() 寫的最滿意的一次題解啦!

POJ 3050 Hopscotch 窮竭搜尋

給乙個5 5的矩陣 從某乙個位置開始能夠向上下左右走 求所有走了6步後,走過的矩陣元素 數字 的序列 include include include include include include include include include include include include inc...

瑞幸復活記

2021年8月,成立快四年的瑞幸咖啡搬離了原來在北三環聯想橋的辦公室,他們搬進了朝陽區的乙個假日酒店裡。瑞幸員工們將要在此工作半年,內部稱之為臨時辦公區。聯想橋的辦公室是陸正耀商業版圖的縮影。這裡的兩層辦公樓曾經是神州 寶沃 瑞幸員工工作的地方,在一樓,有瑞幸咖啡 寶沃汽車的門店。搬離聯想橋是瑞幸咖...

自動復活異常終止程序

01 6 26 上午 10 09 05 問題的產生 微軟公司的windows 作業系統已深入到各個領域,基於windows的應用程式更是層出不窮。但人們或多或少都有這樣的經歷,執行在windows上的應用程式會發生異常終止,這時一般要通過手工重新將其啟動。此時,若計算機無人看守,則異常終止的程序就有...