洛谷P4899 werewolf 狼人

2022-06-13 14:54:11 字數 2089 閱讀 3116

在日本的茨城縣內共有 \(n\) 個城市和 \(m\) 條道路。這些城市是根據人口數量的公升序排列的,依次編號為 \(0\) 到 \(n - 1\)。每條道路連線兩個不同的城市,並且可以雙向通行。由這些道路,你能從任意乙個城市到另外任意乙個城市。

你計畫了 \(q\) 個行程,這些行程分別編號為 \(0\) 至 \(q - 1\)。第 \(i(0 \leq i \leq q - 1)\) 個行程是從城市 \(s_i\) 到城市 \(e_i\)。

你是乙個狼人。你有兩種形態:人形狼形。在每個行程開始的時候,你是人形。在每個行程結束的時候,你必須是狼形。在行程中,你必須要變身(從人形變成狼形)恰好一次,而且只能在某個城市內(包括可能是在 \(s_i\) 或 \(e_i\) 內)變身。

狼人的生活並不容易。當你是人形時,你必須避開人少的城市,而當你是狼形時,你必須避開人多的城市。對於每一次行程 \(i(0 \leq i \leq q - 1)\),都有兩個閾值 \(l_i\) 和 \(r_i(0 \leq l_i \leq r_i \leq n - 1)\),用以表示哪些城市必須要避開。準確地說,當你是人形時,你必須避開城市 \(0, 1, \ldots , l_i - 1\) ;而當你是狼形時,則必須避開城市 \(r_i + 1, r_i + 2, \ldots , n - 1\)。這就是說,在行程 \(i\) 中,你必須在城市 \(l_i, l_i + 1, \ldots , r_i\) 中的其中乙個城市內變身。

你的任務是,對每一次行程,判定是否有可能在滿足上述限制的前提下,由城市 \(s_i\) 走到城市 \(e_i\)。你的路線可以有任意長度。

對於一組詢問,我們求出在人形和狼形的時候分別可以到達的點集,然後判斷一下有無交即可。

我們設邊權為連線的兩個點的較小點權,求出其 kruskal 生成樹,那麼對於一次詢問,在狼形的時候可以走的點集就是其中乙個點為根的子樹。同理可以設邊權為較大點權,其 kruskal 生成樹中的乙個子樹為在人形時可以走的點集。

求出兩棵 kruskal 生成樹之後,對於一組詢問 \(s,t,l,r\),我們可以通過倍增找出 \(s\) 和 \(t\) 分別在兩棵樹中的乙個祖先節點,滿足這個祖先節點的權值在可以走的範圍內且深度較小。那麼這兩個節點的子樹就是可以走的點權。

求出兩棵樹的 dfs 序,我們需要判斷的就是兩個 dfs 序的兩個區間是否有交。我們以其中一棵樹的 dfs 序建立可持久化線段樹,以另一棵樹的 dfs 序作為下標。詢問時就直接判斷第乙個區間的可持久化線段樹內,值域在第二個區間的和是否為 \(0\) 即可。

時間複雜度 \(o((m+q)\log n)\)。

#include using namespace std;

const int n=400010,lg=20;

int n,m,q,rt[n];

struct edge1

e1[n];

bool cmp1(edge1 x,edge1 y)

struct kruscal

e[n];

void add(int from,int to)

; head[from]=tot; }

int find(int x)

void kruskal(int id)

} }

int dfs(int x,int fa)

int binary(int x,int l,int r)

}t1,t2;

struct segtree

int query(int nowl,int nowr,int l,int r,int ql,int qr)

}seg;

int main()

t1.kruskal(1); t2.kruskal(2);

t1.tot=t2.tot=0;

for (int i=1;i<=2*n;i++)

for (int i=1;i<=n*2;i++)

if (t2.dfn[i]<=n) rt[i]=seg.ins(rt[i-1],1,n*2,t1.rk[t2.dfn[i]]);

else rt[i]=rt[i-1];

while (q--)

return 0;

}

洛谷P5049 洛谷P5022 題解 旅行

原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...

洛谷練習P2279 P1346

2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...

洛谷 P1396 營救

題目描述 咚咚咚 查水表!原來是查水表來了,現在 找這麼熱心上門的查表員啊!小明感動的熱淚盈眶,開起了門 媽媽下班回家,街坊鄰居說小明被一群陌生人強行押上了警車!媽媽豐富的經驗告訴她小明被帶到了t區,而自己在s區。該市有m條大道連線n個區,一條大道將兩個區相連線,每個大道有乙個擁擠度。小明的媽媽雖然...