互動題真難調…小 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,3
,1
是初始標記,2
表示訪問過且當前點在dfs棧中,3
則表示訪問過但當前點不在dfs棧中。
在dfs中如果我們接下來走到標記為3
的點我們能夠肯定這條邊是被訪問過的(否則應該之前就訪問過該點,因此忽略),走到標記2
則表示我們走到一條返祖邊,記錄一下。
這一遍dfs我們會move
4m−
2n4m-2n
4m−2
n次,每一條非樹邊會正反分別走兩遍。
現在我們得到了原圖的乙個生成樹,然後我們現在還原返祖邊。
注意到我們只有3
33個標記,而我們需要還原返祖邊的具體編號,我們可以將編號用三進製的方法還原,具體來說我們第k
kk次還原這個編號的三進製下第k
kk位的數,我們只需要將每個點的標記設為三進製第k
kk位的數+1即可。
這樣的move
次數是2
⌊log3
n⌋m≤
10m2\lfloor \log_3 n\rfloor m\leq 10m
2⌊log3n
⌋m≤1
0m的。因此總的move
次數≤14m
\leq 14m
≤14m
,滿足要求。
當然這個實現返祖邊和樹邊是一起考慮的:)
時間複雜度:o((
n+m)
log3n
)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 種面值的紙幣 沒有硬幣等其他貨幣 最小的...