ZROI 1254 迷宮 互動

2021-10-08 19:35:18 字數 3298 閱讀 3340

互動題真難調…

小 d 正在走迷宮。

這個迷宮可以被看做 n

nn 個點,m

mm 條邊的連通無向圖。

小 d 在每個點時,僅能夠看到這個點出發有多少條路。自然地,小 d 可以知道他是從第幾條路過來的。顯然,僅有這些資訊是不夠的。因此,小 d 決定給節點做一些標記:

小 d 共可以做 k

kk 種標記,每個節點同時只能是一種標記。初始時,所有節點都是第一種標記(即沒有標記)。

小 d 希望移動不超過 l 步就還原出迷宮的結構:他想要知道,對於每個 1≤d

≤n1 ≤ d ≤ n

1≤d≤

n,圖中共有多少對節點 (u,

v)(u, v)

(u,v

) 滿足節點 u

uu,v

vv 的最短路恰好為 d

dd 呢?

但他並不會,請你幫幫他。

你在迷宮中行走的步數不超過lll。

要求的答案只是一種可行的加密這個圖的方式而已,我們只需要求出這個圖然後dfs一遍即可。

首先如何dfs?

發現題目給出的操作非常支援dfs,具體來說,我們定義三種標記1,2,31是初始標記,2表示訪問過且當前點在dfs棧中,3則表示訪問過但當前點不在dfs棧中。

在dfs中如果我們接下來走到標記為3的點我們能夠肯定這條邊是被訪問過的(否則應該之前就訪問過該點,因此忽略),走到標記2則表示我們走到一條返祖邊,記錄一下。

這一遍dfs我們會move4m−

2n4m-2n

4m−2

n次,每一條非樹邊會正反分別走兩遍。

現在我們得到了原圖的乙個生成樹,然後我們現在還原返祖邊。

注意到我們只有3

33個標記,而我們需要還原返祖邊的具體編號,我們可以將編號用三進製的方法還原,具體來說我們第k

kk次還原這個編號的三進製下第k

kk位的數,我們只需要將每個點的標記設為三進製第k

kk位的數+1即可。

這樣的move次數是2

⌊log⁡3

n⌋m≤

10m2\lfloor \log_3 n\rfloor m\leq 10m

2⌊log3​n

⌋m≤1

0m的。因此總的move次數≤14m

\leq 14m

≤14m

,滿足要求。

當然這個實現返祖邊和樹邊是一起考慮的:)

時間複雜度:o((

n+m)

log⁡3n

)o((n+m)\log_3 n)

o((n+m

)log3​

n)這可能是我…第一次做oi賽制的互動題???然後整出了一堆問題…

#include

"maze.h"

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define ll long long

#define db double

#define maxn 400

#define mod 998244353

#define pr pair

#define x first

#define y second

#define inf 100000

#define mem(x,v) memset(x,v,sizeof(x))

ll read()

while

(c>=

'0'&&c<=

'9')

return x*f;

}// you can call the following functions:

/*int get_edge_number()

int get_coming_edge()

int get_label()

void set_label(int x)

void move(int e)*/

int n,du[maxn+5]

;int t[maxn+5]

[maxn+5]

,g[maxn+5]

[maxn+5]

,dis[maxn+5]

[maxn+5]

;int num[maxn+5]

,a[maxn+5]

,b[maxn+5]

,pw;

intdfs1()

set_label(3

);if(x!=1)

move

(fa)

;return x;

}void

dfs2

(int x)

else

if(t[x]

[i]>0)

}if(x!=1)

move

(fa);}

std::vector<

int>

calc()

std::vector<

int>

solve

(int k,

int lim)

return

calc()

;}/*int main(){

std::vectorres=solve(3,100);

for(int i=0;i

ZROI 白銀御行

本題的男點大概在如何批量的計算兩個矩陣有交。設乙個矩陣的四個端點為 a,b,c,d 對於乙個矩陣 x,另乙個矩陣 y 和它有交,首先要滿足 y 的 a 在 x 的 d 左上方,如圖所示的四個區域,對於第 1 個區域已無問題。第二區發現如果 c 點在 1 內則有,否則無,無的情況正好是 y c x b...

ZROI 19 08 02 計算幾何

1.向量基礎知識 線段樹維護矩乘就好了,矩陣裡需要帶個常數字置。不會積分,告辭。2.簡單題 投影就是點積,直接積就行了,必修四怎麼學的。跟上面的一模一樣。叉積判出不共線的兩種,剩下的直接比較橫座標就可以了。平行向量叉積為 0 垂直向量點積為 0 跨立實驗 對於一條線段,看另一條線段的兩個點是否在它兩...

ZROI117 17 普及 23 知足

儘管這些題目都是 的經典歌曲,但和 毫無關係 好歹說一句 小明正在聽 的歌 知足 突然心情很差,想出了一道機智的題,希望機 yu 智 chun 的你去切 bu cun zai de 了他。你現在正在設計一套新的貨幣系統。這套貨幣系統有以下要求 一共有 k k 種面值的紙幣 沒有硬幣等其他貨幣 最小的...