BZOJ 1984 月下「毛景樹」

2022-04-30 04:45:11 字數 2285 閱讀 4633

【演算法】樹鏈剖分+線段樹

【題解】線段樹的區間加值和區間覆蓋操作不能同時存在,只能存在乙個。

修改:從根節點跑到目標區域路上的標記全部下傳,打完標記再上傳回根節點(有變動才需要上傳)。

詢問:訪問到目標區域路上的標記全部下傳。

我寫的線段樹版本是在打標記的同時便對該點的詢問項(最大值)做了對應更改,即可保證訪問到該點得到的ms就是該點的答案。

訪問某點時如果要詢問最大值就直接拿走,如果要還要訪問該點的子節點就需要下傳。

而修改了某點的值,它的祖先的值就都需要變動,所以一旦修改必須上傳至頂。

對於add和cover不共存的問題,下傳過程:

void pushdown(int

k)

if(t[k].a!=0

)

}

下傳cover時,子樹add'=0,cover'=cover,ms=cover

下傳add時,就要看子樹的標記是cover還是add了。

邊權賦給下面的點,注意lca不算(樹剖過程中順便處理即可,不必寫倍增)

不在同一條重鏈時,是deep[top[u]]大的先,不是deep[u]。

#include#include

using

namespace

std;

const

int maxn=200010,inf=0x3f3f3f3f

;struct treet[maxn*3

];struct edgee[maxn*3

];int dfsnum,n,pos[maxn],size[maxn],first[maxn],deep[maxn],f[maxn],id[maxn*3

],tot,top[maxn];

void insert(int u,int v,int

w)void build(int k,int l,intr)}

void pushdown(int

k)

if(t[k].a!=0

)

}void pushup(int

k)void cover(int k,int l,int r,intx)}

void add(int k,int l,int r,intx)}

int ask(int k,int l,intr)}

void

solve_cover()

if(pos[u]>pos[v])swap(u,v);

if(pos[u]1,pos[u]+1

,pos[v],w);

}void

solve_add()

if(pos[u]>pos[v])swap(u,v);

if(pos[u]1,pos[u]+1

,pos[v],w);

}void

ask_max()

if(pos[u]>pos[v])swap(u,v);

if(pos[u]1,pos[u]+1

,pos[v]));

printf(

"%d\n

",maxs);

}void dfs1(int x,int

fa)}

void dfs2(int x,int tp,int

fa)

else id[(i+1)>>1]=x,add(1

,pos[x],pos[x],e[i].w);

if(k==0)return;//

!!!dfs2(k,tp,x);

for(int i=first[x];i;i=e[i].from

)

if(e[i].v!=fa&&e[i].v!=k)dfs2(e[i].v,e[i].v,x);

}int

main()

build(

1,1,n);

dfs1(

1,-1

); dfs2(

1,1,-1

);

char st[10];int

u,v;

for(;;)

if(st[1]=='

o')solve_cover();//

cover

if(st[1]=='

d')solve_add();//

addif(st[1]=='

a')ask_max();//

maxif(st[1]=='

t')break;//

stop

}

return0;

}

view code

BZOJ1984 月下「毛景樹」

time limit 20 sec memory limit 64 mb submit 1583 solved 500 submit status discuss 毛毛蟲經過及時的變形,最終逃過的一劫,離開了菜媽的菜園。毛毛蟲經過千山萬水,歷盡千辛萬苦,最後來到了小小的紹興一中的校園裡。爬啊爬 爬啊...

bzoj1984 月下「毛景樹」

傳送門 果然強校出的題都有坑 好吧其實是我太弱 都知道化邊權為點權了還沒發現鏈上查詢和修改時的坑 知道了這個這題就是板子題了 code include includeusing namespace std define n 100005 struct tree t n 2 int f n deep ...

BZOJ1984 月下「毛景樹」

題目 月下 毛景樹 解析 樹鏈剖分。注意一下線段樹的標記下傳的問題,先下傳覆蓋標記再下傳增加標記,且下傳覆蓋標記後要將增加標記取消。詳見 算了還是說下問什麼這樣下傳標記吧。如果先下傳add再下傳cover,你會發現對於修改同一區間,操作順序是先add再cover時下傳沒有問題,但如果是先cover再...