P3713 BJOI2017 機動訓練

2022-03-13 05:07:26 字數 3184 閱讀 4982

這個題簡直神仙,求相同路徑的平方就等於兩個人走相同路徑的方案數。然後。。。暴力搜尋+記憶化就行了,比較玄學。

題幹:

題目描述

整個島可以看作一片 n*m 的區域,每個格仔有自己的地形。

一條路徑由一系列八連通的格仔組成,兩個格仔八連通當且僅當這兩個格仔擁有公共的

頂點。定義一條「機動路徑」如下:

1、它是一條不自交的路徑,即路徑上任意兩個格仔都不是同乙個

2、它的起點和終點處於不同位置,換言之這條路徑至少包含 2

個格仔3

、從起點開始,任何一步只能向不遠離終點的方向移動,這裡不遠離指的是 x 和 y 兩

個方向都不遠離

舉例說明(字元畫需要用等寬字型檢視):

.....y ...... .---.

-++... ---... .-x-.

-x+... -x+..y .-+-.

---... ---... ..y..

圖中加號和減號標明了與 x 八連通的所有格仔,其中加號是「不遠離 y」的方向

因此可以看出,如下路徑是機動路徑:

++++++y ......+y .......y

+...... .....++. ......+.

+...... ..++++.. ...+++..

x...... x++..... x+++....

而如下路徑不是機動路徑:

\../---y .......y .x.

|--..... ....../. /..

|....... x..../.. \..

x....... .\--/... .y.

需要注意的是,某些不合法的路徑甚至比機動路徑還要短,這是因為機動路徑不是按照

長度來定義的。

接下來定義一條機動路徑的地形,島上的地形由乙個矩陣給出,如

.**.

*..*

*..*.**.

那麼,一條機動路徑的地形序列就是它所經過的地形排成一列,如

x-\.

...\

...|...y

的地形序列就是

".****.

"(不包含引號)

每條機動路徑的權重就是與之擁有相同地形序列的機動路徑數量之和,例如與這條路徑

擁有相同地形序列的路徑有

./-y y... ...x x-\. ./-x x... ...y y-\.

/... |... ...| ...\ /... |... ...|...\

|... \... .../ ...| |... \... .../ ...|x... .\-x y-/. ...y y... .\-y x-/. ...x共 8

條,注意回文時正反算兩條,以及自己也算一條。

所以這條機動路徑的權重是

8,同時所有這 8 條機動路徑的權重都是 8

。現在你需要統計所有的機動路徑權重之和。

如果對這種統計方式沒有直觀的感受,可以檢視樣例說明。

**:

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

#define duke(i,a,n) for(register int i = a;i <= n;++i)

#define lv(i,a,n) for(register int i = a;i >= n;--i)

#define clean(a) memset(a,0,sizeof(a))

const

int inf = 1

<< 30

;typedef

long

long

ll;typedef

double

db;template

void read(t &x)

template

void

write(t x)

const

int n = 31,mod = 1000000009

;int n,m,f[n][n][n][n],g[3][3][3][3

],ans;

int dx[4],dy[4],dp[4],dq[4

],tp1,tp2;

char

str[n][n];

int dp(int x,int y,int p,int

q) }

return f[x][y][p][q] =res;

}int calc(int x,int y,int p,int

q) }}}

tp2 = 0

; duke(i,-1,1

) }}

}int res = 0

; memset(f,-1,sizeof

(f));

duke(i,

1,n)}}

}g[x + 1][y + 1][p + 1][q + 1] =res;

g[p + 1][q + 1][x + 1][y + 1] =res;

g[-x + 1][-y + 1][-p + 1][-q + 1] =res;

g[-p + 1][-q + 1][-x + 1][-y + 1] =res;

return

res;

}int calc(int x,int

y)int

main()

memset(g,-1,sizeof

(g));

ans = (ans + calc(1,1)) %mod;

ans = (ans + calc(1,-1)) %mod;

ans = (ans + calc(-1,1)) %mod;

ans = (ans + calc(-1,-1)) %mod;

ans = (ans - calc(1,0) + mod) %mod;

ans = (ans - calc(-1,0) + mod) %mod;

ans = (ans - calc(0,1) + mod) %mod;

ans = (ans - calc(0,-1) + mod) %mod;

printf(

"%d\n

",ans);

return0;

}

洛谷 P3713 BJOI2017 機動訓練

參考部落格 洛谷 p3713 有一張 n times m 的網格圖,每個格仔上有乙個字元,乙個格仔是八聯通的,定義一條路徑 選定起點 s 終點 t s not t 設一步後從 x,y 走到了 x y 那麼 tx x ge tx x ty y ge ty y 將經過格仔上的字元連成乙個字串,則這條路徑...

2 sat 分類討論 UVALIVE 3713

藍書326 看看會不會爆int 陣列會不會少了一維!取物問題一定要小心先手勝利的條件 include using namespace std pragma comment linker,stack 102400000,102400000 define ll long long define all ...

P4001 BJOI2006 狼抓兔子

不少題解都是用網路流來做最小割 網路流是什麼 但對於乙個不會網路流的蒟蒻來做這題相當困難。聽機房daolao說可以重構圖做最短路。然後就baidu將平面圖轉換成乙個對偶圖,因為網路流的最小割 對偶圖的最短路,所以只要在對偶圖上跑最短路 從左上角跑到右下角 就行了。由於堆優化的dijkstra寫炸了,...