給定乙個 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上的應用程式會發生異常終止,這時一般要通過手工重新將其啟動。此時,若計算機無人看守,則異常終止的程序就有...