bzoj 5210 樹鏈刨分下做個dp)

2022-06-02 07:06:08 字數 2868 閱讀 9963

time limit: 20 sec  memory limit: 128 mb

submit: 211  solved: 65

[submit][status][discuss]

給出一棵n個點、以1為根的有根樹,點有點權。要求支援如下兩種操作:

m x y:將點x的點權改為y;

q x:求以x為根的子樹的最大連通子塊和。

其中,一棵子樹的最大連通子塊和指的是:該子樹所有子連通塊的點權和中的最大值

(本題中子連通塊包括空連通塊,點權和為0)。

第一行兩個整數n、m,表示樹的點數以及操作的數目。

第二行n個整數,第i個整數w_i表示第i個點的點權。

接下來的n-1行,每行兩個整數x、y,表示x和y之間有一條邊相連。

接下來的m行,每行輸入乙個操作,含義如題目所述。保證操作為m x y或q x之一。

1≤n,m≤200000 ,任意時刻 |w_i|≤10^9 。

對於每個q操作輸出一行乙個整數,表示詢問子樹的最大連通子塊和。

5 43 -2 0 3 -1

1 21 3

4 22 5

q 1m 4 1

q 1q 243

1我不知道什麼動態dp,我只知道這是乙個資料結構題。每次寫個樹鏈刨分都得弄半天orz。

大神題解:cqzhangyu

1 #include2

#define clr(x) memset(x,0,sizeof(x))

3#define clr_1(x) memset(x,-1,sizeof(x))

4#define inf 0x3f3f3f3f

5#define ll long long

6#define pb push_back

7#define ls(i) (i<<1)

8#define rs(i) (i<<1|1)

9#define mp make_pair

10#define fi first

11#define se second

12using

namespace

std;

13const

int n=2e5+10;14

inttsize[n];

15int

son[n],down[n],top[n],dep[n],pos[n],pot[n],fat[n];

16int

tot;

17int

n,q;

18ll v[n],f[n],g[n],maxs[n];

19 vectore[n];

20struct

heap

2128 inline void

pop(ll x)

2933

inline ll top()

3440

void

pop()

4146

}lsq[n];

47void dfs1(int u,int d,int

fa)4865}

66//

cout<

return;68

}69void dfs2(int u,int

tp)7088}

89 f[u]=max(0ll,g[u]+f[son[u]]),maxs[u]=max(maxs[u],f[u]),maxs[u]=max(maxs[u],lsq[u].top());

90return;91

}92struct

segt

93107 }seg[n<<2

];108

void init(int i,int l,int

r)109

;114

return

;115

}116

int mid=l+r>>1

;117 init(i<<1

,l,mid);

118 init(i<<1|1,mid+1

,r);

119 seg[i]=seg[i<<1]+seg[i<<1|1

];120

return

;121

}122

char s[10

];123

void refresh(int i,int

pos)

124;

129 seg[i]=p;

130return

;131

}132

int mid=seg[i].l+seg[i].r>>1

;133

if(mid>=pos) refresh(i<<1

,pos);

134else refresh(i<<1|1

,pos);

135136 seg[i]=seg[i<<1]+seg[i<<1|1

];137

return

;138

}139 segt query(int i,int l,int

r)140

147void update(int

u,ll val)

148164

return

;165

}166

intmain()

167179 dfs1(1,1,0

);180 dfs2(1,1

);181 init(1,1

,n);

182for(int i=1;i<=q;i++)

183193

else

194199

}200

return0;

201 }

view code

BZOJ 3306 樹 樹鏈剖分

和bzoj 3083比就是弱化版了。樣例都有點像?include include using namespace std const int n 100005,m n 3,inf 0x7fffffff int read int next m to m head n sz n son n top n ...

樹鏈剖分 bzoj2243

time limit 20 sec memory limit 512 mb submit 2492 solved 960 submit status 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段數量 連續相同顏色...

bzoj4034 樹鏈剖分

time limit 10 sec memory limit 256 mb submit 7576 solved 2597 submit status discuss 有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個 操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作...