Bzoj3083 遙遠的國度

2021-07-28 21:36:30 字數 1456 閱讀 4816

給定一棵有根樹,支援3種操作:

1.把首都修改為id;

2.將p1 p2路徑上的所有城市的防禦值修改為v;

3.詢問以城市id為根的子樹中的最小防禦值。

畫了一堆圖之後終於搞懂了一點點,首先換根的話肯定不是真的換。對於每次詢問,設現在的根為root,準備詢問的結點為x。來考慮幾種情況。

1.root == x ,詢問整棵樹,直接輸出全集。

2.root不為x的子樹,則直接考慮x的整棵子樹。

3.root為x的子樹(也可能是x的某子樹中的結點),則不能考慮x的這棵子樹,就直接抹去這一段考慮其補集,邊界條件的話要注意,不然可能re。

#include 

#include

#include

#define rep(i,s,t) for(int i=s;i<=t;i++)

#define for(i,s,t) for(int i=s;i;i=t)

using

namespace

std;

const

int maxx = 100000 + 25;

const

int inf = (unsigned)(-1) >> 1;

int head[maxx],nxt[maxx<<1],to[maxx<<1];

int top[maxx],rnk[maxx],size[maxx],ftr[maxx],son[maxx],dpt[maxx];

int a[maxx],t[maxx<<2],add[maxx<<2],fnl[maxx];

int n,m,num,f,cnt,x,y,z,root;

namespace y

void dfs1(int x)

}void dfs2(int x,int brn)

void pushdown(int i)

void modify(int i,int x,int y,int l,int r,int k)

if(add[i]) pushdown(i);int mid = (l+r) >> 1;

if(x <= mid) modify(i<<1,x,y,l,mid,k);

if(y > mid) modify(i<<1|1,x,y,mid+1,r,k);

t[i] = min(t[i<<1],t[i<<1|1]);

}int query(int i,int x,int y,int l,int r)

void update(int x,int y,int k)

if(rnk[x] > rnk[y]) x^=y^=x^=y;

modify(1,rnk[x],rnk[y],1,n,k);

}int get(int x)

}using

namespace y;

int main()

return

0;}

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...