洛谷 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 #include4using
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的路徑上的節點的權值和 注意 從點...