博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【ZJOI2008】树的统计(树链剖分)
阅读量:4637 次
发布时间:2019-06-09

本文共 2952 字,大约阅读时间需要 9 分钟。

Solution:

就是树链剖分入门题啦~

// luogu-judger-enable-o2#include
#define N 30005#define M 200005#define lson now<<1#define rson now<<1|1#define INF 0x7fffffffusing namespace std;int n,tot,first[N],val[N];int father[N],size[N],maxson[N],depth[N],top[N],id[N],sign,wnew[N];int ans=0;struct Edge{ int to,next;}edge[2*N];inline void addedge(int x,int y){ tot++; edge[tot].to=y; edge[tot].next=first[x]; first[x]=tot;}struct node{ int l,r,sum,maxv;}tree[4*N];inline void build(int l,int r,int now){ tree[now].l=l,tree[now].r=r,tree[now].sum=0,tree[now].maxv=0; if(l==r) { tree[now].sum=wnew[l]; tree[now].maxv=wnew[l]; return; } int m=(l+r)>>1; build(l,m,lson); build(m+1,r,rson); tree[now].sum=tree[lson].sum+tree[rson].sum; tree[now].maxv=max(tree[lson].maxv,tree[rson].maxv);}inline void update(int now,int x,int k){ if(tree[now].l==x&&tree[now].r==x) { tree[now].sum=k; tree[now].maxv=k; return; } int m=(tree[now].l+tree[now].r)>>1; if(x<=m) update(lson,x,k); else update(rson,x,k); tree[now].sum=tree[lson].sum+tree[rson].sum; tree[now].maxv=max(tree[lson].maxv,tree[rson].maxv);}inline void query_sum(int l,int r,int now){ if(l<=tree[now].l&&tree[now].r<=r) { ans+=tree[now].sum; return; } int m=(tree[now].l+tree[now].r)>>1; if(l<=m) query_sum(l,r,lson); if(r>m) query_sum(l,r,rson);}inline void query_max(int l,int r,int now){ if(l<=tree[now].l&&tree[now].r<=r) { ans=max(ans,tree[now].maxv); return; } int m=(tree[now].l+tree[now].r)>>1; if(l<=m) query_max(l,r,lson); if(r>m) query_max(l,r,rson);}inline void dfs1(int now,int fa){ father[now]=fa; size[now]=1; depth[now]=depth[fa]+1; for(int u=first[now];u;u=edge[u].next) { int vis=edge[u].to; if(vis==fa) continue; dfs1(vis,now); size[now]+=size[vis]; if(size[vis]>size[maxson[now]]) maxson[now]=vis; }}inline void dfs2(int now,int topf){ id[now]=++sign; top[now]=topf; wnew[sign]=val[now]; if(maxson[now]) dfs2(maxson[now],topf); for(int u=first[now];u;u=edge[u].next) { int vis=edge[u].to; if(vis==father[now]||vis==maxson[now]) continue; dfs2(vis,vis); }}inline int qmax(int x,int y){ int ret=-INF; while(top[x]!=top[y]) { if(depth[top[x]]
>n; for(int i=1;i<=n-1;i++) { int x,y; cin>>x>>y; addedge(x,y); addedge(y,x); } for(int i=1;i<=n;i++) cin>>val[i]; dfs1(1,0); dfs2(1,1); build(1,n,1); int Q; cin>>Q; while(Q--) { string s; int x,y; cin>>s>>x>>y; if(s=="CHANGE") update(1,id[x],y); if(s=="QMAX") cout<
<<'\n'; if(s=="QSUM") cout<
<<'\n'; } return 0;}

转载于:https://www.cnblogs.com/Patrickpwq/articles/9467483.html

你可能感兴趣的文章
403. Frog Jump
查看>>
C++学习之二分查找续
查看>>
Vue创建SPA那些事
查看>>
python基础学习1-列表推导式和字典推导式
查看>>
Linux下开发python django程序(模板设置和载入数据)
查看>>
mfc Radio Buttons
查看>>
Python【第三章】:python 面向对象 (new)
查看>>
redis学习总结
查看>>
css文字禁止选中
查看>>
[刘阳Java]_Java环境搭建_第2讲
查看>>
[JavaScript]父子窗口间参数传递
查看>>
Test Controller Tool
查看>>
86. Partition List
查看>>
[LintCode] 378 Convert Binary Search Tree to Doubly Linked List 解题报告
查看>>
JAVA-初步认识-常用对象API(集合框架-泛型-泛型限定-上限的体现)
查看>>
caffe中的若干问题
查看>>
webpack学习(一)—— 入门
查看>>
c# 调用 webservices (转载)
查看>>
结对-(first)
查看>>
P1567 统计天数
查看>>