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> ...
随机推荐
- 样本、文库、重复、lane、run - 二代测序原理及名词解释
参考: 独占鳌头的Illumina仪器(二代测序篇) HiSeq2000测序原理.流程与仪器 NGS文库制备的方法比较[心得点评] 各种测序文库构建方式 样本:就是待测的DNA.RNA或蛋白序列,样本 ...
- 冰球项目日志1-yjw
第一次小组讨论结果 功能需求分析 通过已知输入:球位置速度,击球手位置速度.确定输出:击球手击球时速度,击球点位置,击球手轨迹. 功能分解 1 通过当前的球位置速度,判断是否会进入我方球门,以判断是否 ...
- NotORM(PHP的ORM框架)
类似Thinkphp映射到表的ORM机制. 网址:http://www.notorm.com/ <?php //require_once ‘init.php’;require_once ‘Not ...
- jq点击小图 弹出大图(更新版)
$(function(){ $(".fj1-consult").on("click",function(){ //设置弹框中图片的路径 $(".lay ...
- for(String s:v)
s是遍历后赋值的变量,v是要遍历的list.可以通过以下语句进行测试: List<String> v=new ArrayList(); v.add("one"); v. ...
- 解决Strokeit在win8下的图标问题和开机启动问题
Strokeit目前和Windows 8有一点不兼容,就是运行之后,任务栏会有它的图标,看着很不爽,用兼容模式运行可解决这个问题,但是这样一来就不能开机自动运行了,本文主要解决这个问题. (参考资料 ...
- 采购信息记录修改[BDC]
*&---------------------------------------------------------------------* *& *&---------- ...
- 关于tomcat内路径跳转的一些思考
初学jsp+servlet时经常碰上的几个错误:404.路径正确但页面没有任何内容.样式和图片丢失. 这几个错误曾经让我在debug时头大,现在总结一下,其实它们都跟路径有关,正是因为没有处理好路径跳 ...
- 递归算法(三)——多项分布问题
问题 一个枪手打靶,靶从外向内有1-10分(考虑脱靶得0分),打十枪,求枪手最后得90分的概率. 解决思路 一.穷举 考虑10重for循环,累计十次得分和为90者,求得概率.该法通用性差,效率低,但容 ...
- vb.net 网络图片
https://msdn.microsoft.com/zh-cn/library/ms251715(VS.80).aspx