題解 洛谷P3950 部落衝突

2022-07-14 08:06:11 字數 2326 閱讀 4292

\[\text

\]\(\quad\)一道很簡單的樹剖題,只有三種操作(其實是兩種),唯一要考慮的點是如何將邊權轉化成點權,考慮到每個點都有且只有乙個父親節點(除根節點1之外),那麼我們就可以將父親與兒子連線的邊權記錄到兒子身上,這樣 \(n-1\) 條邊就可以合理的分配到 \(n-1\) 個點上(除了根節點),這樣就轉化成了普通的樹鏈剖分模板了(如果還不能理解就看看圖吧)。

原圖

經過轉化後的圖(將邊權轉化為點權)

注意:對於路徑\(4-2-5\),只需訪問點 \(4\) 和點 \(5\),對於 \(4\) 和 \(5\) 的 \(lca\) (最近公共祖先)不可取,因為 \(2\) 在原圖中對應的是邊 \(1-2\),並不在路徑\(4-2-5\)上,所以在樹鏈剖分中當 \(x\) 和 \(y\) 在同一條鏈上時(\(dep[x]),只需詢問 \(x+1\) 到 \(y\) 的路徑。

\[\text

\]操作 \(1\):單點修改,兩個相鄰的部落開戰,他們之間的道路不可通行。

操作 \(2\):區間詢問,詢問兩個點之間的路徑能否通行。

操作 \(3\):單點修改,兩個開戰的部落停戰,他們之間的道路可以通行。

\(\quad\)可以很容易發現操作 \(1\)和操作 \(3\) 其實是一種操作,只需開乙個陣列 \(u\)[\(x\)][\(2\)] 來記錄參與第\(x\)次戰爭的兩個部落,開戰將這條邊標記為 \(0\),意為不可通行,停戰就把這條邊標記為 \(1\),意為可以通行,用線段樹維護區間和(也可以是最小值),當\(sum\)[\(k\)]==\(r\)-\(l\)+\(1\) 時說明這個區間內所有邊皆可通行,否則至少有\(1\)條邊不可通行。

\(\quad\)下面貼出ac**,建議反覆閱讀,深刻理解。

#include#include#include#include#include#include#define il inline

#define inf 1e18

#define next nne

#define re register int

using namespace std;

il int read() //快速讀入

const int n=3e5+5;

int n,m,next[n<<1],go[n<<1],head[n],tot,u[n][2],sum[n<<2];

int seg[n],son[n],father[n],top[n],size[n],dep[n];

il void add(int x,int y) //鏈式前向星存圖

il void dfs1(int x,int fa)

}il void dfs2(int x,int topf)

}il void build(int k,int l,int r) //建樹,每個點初始值為1

int mid=l+r>>1;

build(k<<1,l,mid);build(k<<1|1,mid+1,r);

sum[k]=sum[k<<1]+sum[k<<1|1];

}il void change(int k,int l,int r,int x,int z)

int mid=l+r>>1;

if(x<=mid)change(k<<1,l,mid,x,z);

else change(k<<1|1,mid+1,r,x,z);

sum[k]=sum[k<<1]+sum[k<<1|1];

}il bool query1(int k,int l,int r,int x,int y)

int mid=l+r>>1;

if(x<=mid)if(!query1(k<<1,l,mid,x,y))return 0;

if(y>mid)if(!query1(k<<1|1,mid+1,r,x,y))return 0;

return 1;

}il void change1(int x,int y)

il void change2(int x)

il bool query(int x,int y)

signed main()

else if(ch=='q')

else

}return 0;

}

\[\text

\]\(\quad\)此題和cf165d beard graph很像,那題也有我的題解,歡迎支援。

\(\quad\)謝謝觀賞,寫題解不易,點個贊吧!

洛谷P3950 部落衝突 LCT

題目傳送門 格式難調,體面就不放了。分析 julao們應該都看得出來就是個 lct 板子,戰爭就 cut 結束就 link 詢問就 find 沒了。太久沒打 lct 然後發現自己之前貌似理解得並不透徹,打得還是不熟。code it is made by holselee on 5th sep 201...

P3950 部落衝突

此題用樹鏈剖分是大材小用了,因為它可以處理 p,q 不相鄰的情況。簡化一下題意 這都是一些樹上的操作,乍一看可以用樹剖直接搞。但是因為這裡是邊進行操作,所以我們可以以點代邊,把邊看做點。每一次查詢的時候 lca p,q 是不能算的。如果 p,q 不相鄰,我們可以加入樹剖的修改操作,但是線段樹的修改操...

P3950 部落衝突(樹鏈剖分)

簡單起見,你就是要處理下面三件事,所有的事件都是按照時間順序給出的。q p q從第 pp 個部落出發的建築工人想知道能否到達第 qq 個部落了,你要回答的便是yes no,注意大小寫。c p q第 pp 個部落與第 qq 個部落開戰了,保證他們一定是相鄰的部落,且目前處於停戰 未開戰 狀態。u x第...