BZOJ 3083 遙遠的國度

2022-04-30 03:00:08 字數 2369 閱讀 5134

bzoj_3083_遙遠的國度_樹鏈剖分

描述zcwwzdjn在追殺十分sb的zhx,而zhx逃入了乙個遙遠的國度。當zcwwzdjn準備進入遙遠的國度繼續追殺時,守護神rapid阻攔了zcwwzdjn的去路,他需要zcwwzdjn完成任務後才能進入遙遠的國度繼續追殺。

問題是這樣的:遙遠的國度有n個城市,這些城市之間由一些路連線且這些城市構成了一顆樹。這個國度有乙個首都,我們可以把這個首都看做整棵樹的根,但遙遠的國度比較奇怪,首都是隨時有可能變為另外乙個城市的。遙遠的國度的每個城市有乙個防禦值,有些時候rapid會使得某兩個城市之間的路徑上的所有城市的防禦值都變為某個值。rapid想知道在某個時候,如果把首都看做整棵樹的根的話,那麼以某個城市為根的子樹的所有城市的防禦值最小是多少。由於rapid無法解決這個問題,所以他攔住了zcwwzdjn希望他能幫忙。但zcwwzdjn還要追殺sb的zhx,所以這個重大的問題就被轉交到了你的手上。

第1行兩個整數n m,代表城市個數和運算元。

第2行至第n行,每行兩個整數 u v,代表城市u和城市v之間有一條路。

第n+1行,有n個整數,代表所有點的初始防禦值。

第n+2行乙個整數 id,代表初始的首都為id。

第n+3行至第n+m+2行,首先有乙個整數opt,如果opt=1,接下來有乙個整數id,代表把首都修改為id;如果opt=2,接下來有三個整數p1

p2 v,代表將p1 p2路徑上的所有城市的防禦值修改為v;如果opt=3,接下來有乙個整數

id,代表詢問以城市id為根的子樹中的最小防禦值。

對於每個opt=3的操作,輸出一行代表對應子樹的最小點權值。

3 71 2

1 31 2 3

13 1

2 1 1 6

3 12 2 2 5

3 12 3 3 4

3 1123

4總不能每次換根都對整個樹剖一遍,因此我們要先以1為根進行樹剖,然後對根的位置進行分類討論。

假設詢問的時x,根為root。

當root=x時直接輸出整個樹的最小值,這個必須要判而不能放到其他分類中。

當root在x的子樹外時,由於x的子樹沒有變,相當於還是查詢x的子樹。

當root在x的子樹內時,答案由兩部分組成:

1.x子樹外,這個對應樹剖序上兩段區間。

2.x子樹內,需要刨去x到root路徑上的點,我們對root不斷跳重鏈,直到跳到x的兒子上,這個點的子樹需要刨去,剩下的也是兩段區間。

分類討論完成後直接樹剖+線段樹即可。

注意權值可能爆int,需要用unsigned int

**:

#include #include #include using namespace std;

#define n 100050

#define ls p<<1

#define rs p<<1|1

#define inf ((1u<<31)+1)

typedef unsigned int un;

int head[n],to[n<<1],nxt[n<<1],n,cnt,m;

int son[n],fa[n],dep[n],siz[n],top[n],idx[n],root;

un t[n<<2],tag[n<<2],val[n],a[n];

inline void add(int u,int v)

void dfs1(int x,int y)

}}void dfs2(int x,int t)

}void build(int l,int r,int p)

int mid=(l+r)>>1;

build(l,mid,ls); build(mid+1,r,rs);

t[p]=min(t[ls],t[rs]);

}inline void pushdown(int p)

}void update(int l,int r,int x,int y,un v,int p)

pushdown(p);

int mid=(l+r)>>1;

if(x<=mid) update(l,mid,x,y,v,ls);

if(y>mid) update(mid+1,r,x,y,v,rs);

t[p]=min(t[ls],t[rs]);

}un qmin(int l,int r,int x,int y,int p)

un solve(int x,int y)

int main()

if(dep[x]idx[x]+siz[x]-1) else else else

while(fa[y]!=x) y=fa[y];

re=min(re,solve(x,y));}}

printf("%u\n",re);}}

}}

bzoj3083 遙遠的國度

題意 給定一棵樹,支援換根,路徑權值覆蓋,求子樹最小。思路 求子樹?上樹鏈剖分,但是換根怎麼辦?我們只能通過原有資訊推出換根後的答案。換根不影響路徑修改,所以只要考慮子樹最小值的維護。這裡要分3種情況討論 1 如果詢問點是當前根,直接返回整棵樹的最小值。2 如果在原樹中,當前根不在 x的子樹中,直接...

bzoj3083 遙遠的國度

time limit 10 sec memory limit 1280 mb submit 1733 solved 429 submit status discuss description 描述 zcwwzdjn在追殺十分sb的zhx,而zhx逃入了乙個遙遠的國度。當zcwwzdjn準備進入遙遠的...

bzoj3083 遙遠的國度

time limit 10 sec memory limit 1280 mb submit 1960 solved 484 submit status discuss 描述zcwwzdjn在追殺十分sb的zhx,而zhx逃入了乙個遙遠的國度。當zcwwzdjn準備進入遙遠的國度繼續追殺時,守護神ra...