lightoj1348
//Accepted 6004 KB 924 ms /* source: lightoj1348 time :2015.5.29 by :songt */ /*题解: 树链剖分 */ #include <cstdio> #include <cstring> ; void swap(int &a,int &b) { int t=a; a=b; b=t; } struct Edge { int u,v; Edge(){} Edge(int u,int v):u(u),v(v){} }edge[*imax_n]; int head[imax_n]; *imax_n]; int tot; void addEdge(int u,int v) { edge[tot]=Edge(u,v); next[tot]=head[u]; head[u]=tot++; } int fa[imax_n],deep[imax_n],num[imax_n],son[imax_n]; int p[imax_n],fp[imax_n],top[imax_n]; int pos; void init() { memset(head,-,sizeof(head)); memset(next,-,sizeof(next)); tot=; memset(son,-,sizeof(son)); pos=; } void dfs1(int u,int pre,int depth) { deep[u]=depth; fa[u]=pre; num[u]=; ;i=next[i]) { int v=edge[i].v; if (v!=pre) { dfs1(v,u,depth+); num[u]+=num[v]; || num[son[u]]<num[v]) son[u]=v; } } } void dfs2(int u,int sp) { p[u]=pos++; fp[p[u]]=u; top[u]=sp; ) return ; dfs2(son[u],sp); ;i=next[i]) { int v=edge[i].v; if (v!=fa[u] && v!=son[u]) { dfs2(v,v); } } } struct Tree { int l,r; int sum; }f[imax_n*]; int a[imax_n]; void build(int t,int l,int r) { f[t].l=l; f[t].r=r; f[t].sum=; if (l==r) { f[t].sum=a[fp[l]]; return ; } ; build(*t,l,mid); build(*t+,mid+,r); f[t].sum=f[*t].sum+f[*t+].sum; } void update(int t,int k,int value) { if (f[t].l==k && f[t].r==k) { f[t].sum=value; return ; } ; *t,k,value); *t+,k,value); f[t].sum=f[*t].sum+f[*t+].sum; } int query(int t,int l,int r) { if (f[t].l==l && f[t].r==r) { return f[t].sum; } ; *t,l,r); else { *t+,l,r); *t,l,mid)+query(*t+,mid+,r); } } int find(int u,int v) { int f1=top[u],f2=top[v]; ; while (f1!=f2) { if (deep[f1]<deep[f2]) { swap(f1,f2); swap(u,v); } ans+=query(,p[f1],p[u]); u=fa[f1]; f1=top[u]; } if (deep[u]>deep[v]) swap(u,v); ans+=query(,p[u],p[v]); return ans; } int n,m; int main() { int T; ; scanf("%d",&T); while (T--) { printf("Case %d:\n",++t); init(); scanf("%d",&n); ;i<n;i++) scanf("%d",&a[i]); int u,v; int c; ;i<n-;i++) { scanf("%d%d",&u,&v); addEdge(u,v); addEdge(v,u); } dfs1(,-,); dfs2(,); build(,,pos-); scanf("%d",&m); int kind; ;i<m;i++) { scanf("%d%d%d",&kind,&u,&v); ) { printf("%d\n",find(u,v)); } else { update(,p[u],v); } } } ; }
lightoj1348的更多相关文章
- LightOJ1348 树链剖分
简单题,看题目就懂. #include<queue> #include<stack> #include<cmath> #include<cstdio> ...
随机推荐
- 【转】 linux内存管理
一 为什么需要使用虚拟内存 大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多.问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕.所以提出了虚拟内存,使得 ...
- LoadRunner脚本参数化设置
LoadRunner,是一种预测系统行为和性能的负载测试工具,其中VUG(Virtual User Generator)主要用于虚拟用户生成和脚本编辑.为了实现单用户多次迭代执行脚本,VUG提供了强大 ...
- Hexo+Github 高逼格个人博客搭建指南(准备篇)
git 下载并安装git 进入git下载页面,下载合适的版本,并安装.一路 Next ,到了 Select Components 界面,勾选 Git Bash Here 和 Git GUI Here. ...
- 处理某个json文件的代码
# encoding=utf-8 import json,re with open('E:\\weather53892_20114.json','r') as f: data= f.readlines ...
- Linux中修改环境变量导致大量命令不可用的解决办法
如果搞死环境变量别慌张.因为ls等命令都不能使用了,所以先找到/usr/bin/目录 使用./sudo su命令获取root权限 然后在进入/etc目录 利用vim profile命令 修改profi ...
- Python学习笔记之Beautiful Soup
如何在Python3.x中使用Beautiful Soup 1.BeautifulSoup中文文档:http://www.crummy.com/software/BeautifulSoup/bs3/d ...
- Unity3D 中的定时器
不算上 C# 自带的,目前知道两种,以下分别介绍. 1.每帧检查 定义一个时间变量 timer,每帧将此时间减去帧间隔时间 Time.deltaTime,如果小于或者等于零,说明定时器到了,执行相应功 ...
- ajax和sap以及网络安全
1.sap(single page applaction)一个页面通过众多ajax请求完成的一个app 优点是:减少页面跳转,UI公用部分的重复加载 缺点: 1.ajax过多的请求,对服务器性能有所 ...
- php学习函数
1defined和define区别 2.dirname(__FILE__) 3.set_include_path 4.get_include_path 5.realpath() 6.require_p ...
- 51nod1305 Pairwise Sum and Divide
题目链接:51nod 1305 Pairwise Sum and Divide 看完题我想都没想就直接暴力做了,AC后突然就反应过来了... Floor( (a+b)/(a*b) )=Floor( ( ...