ZJOI2008 樹的統計

2022-05-09 19:58:04 字數 2065 閱讀 2460

洛谷 p2590 傳送門

bzoj 1036 傳送門

感覺最近有點虛,碼個板子爽一下。

居然沒一a,交了兩遍才a......

其原因是定義qmx函式的時候我懶得重敲一遍,直接把qsum那個複製過來改了一下。

然後忘把qsum(p<<1,l,r)和qsum(p<<1|1,l,r)改成qmx了。

這樣的話只要是qmx操作,第一遍還是qmx,分治到兩邊就變成qsum了......

**:

1 #include2 #include3 #include4

using

namespace

std;56

intn,q;

7int hd[30005],to[60005],nx[60005

],ec;

8int bv[30005];9

10void edge(int af,int

at)11

1617

int f[30005],dep[30005],tp[30005

];18

int sz[30005],son[30005

];19

intin[30005],out[30005],pc,pos[30005

];20

21void pre(int p,int

fa)2233}

3435

void dfs(int

p)36

4647

int sum[120005],mx[120005],lb[120005],rb[120005

];48

49void pushup(int

p)50

5455

void build(int p,int l,int

r)56

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

;64 build(p<<1

,l,mid);

65 build(p<<1|1,mid+1

,r);

66pushup(p);67}

6869

void change(int p,int pnt,int

v)70

76int mid=(lb[p]+rb[p])>>1;77

if(pnt<=mid)change(p<<1

,pnt,v);

78else change(p<<1|1

,pnt,v);

79pushup(p);80}

8182

int qsum(int p,int l,int

r)83

9091

int qmx(int p,int l,int

r)92

99100

intmain()

101110

for(int i=1;i<=n;i++)scanf("

%d",&bv[i]);

111 pre(1,1

);112 dfs(1

);113 build(1,1

,n);

114 scanf("

%d",&q);

115while(q--)

116125

if(op[2]=='m'

)126

136if(dep[x]>dep[y])swap(x,y);

137 ans=max(qmx(1,in[x],in

[y]),ans);

138 printf("

%d\n

",ans);

139}

140if(op[2]=='s'

)141

151if(dep[x]>dep[y])swap(x,y);

152 ans+=qsum(1,in[x],in

[y]);

153 printf("

%d\n

",ans);

154}

155}

156return0;

157 }

ZJOI 2008 樹的統計

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...

ZJOI2008 樹的統計

zjoi2008 樹的統計 題目描述 一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到...

ZJOI2008 樹的統計

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...