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> ...
随机推荐
- [分享] 封装工具ES4配置文件解释
[分享] 封装工具ES4配置文件解释 LiQiang 发表于 2015-2-3 14:41:21 https://www.itsk.com/thread-346132-1-4.html [分享] 封装 ...
- LSMW批处理工具操作手册
目录 1. 创建PROJECT 1 2.第一步:初始界面后点击执行出现如下对话框 3 3.第二步:维护源结构 8 4.第三步:Maintain Source Fields 9 4. ...
- 一张图看懂单机/集群/热备/磁盘阵列(RAID)
- 如何在页面进入时就加载js
页面一打开就执行JS的代码! onLoadwindow.onLoad=function(){}window.onload=function(){ } 补充:window.onload和doucumen ...
- leetcode刷题全纪录(持续更新)
2.Add Two Numbers 原题链接https://leetcode.com/problems/add-two-numbers/ AC解: public ListNode addTwoNumb ...
- 13 个免费的 PNG 图像的优化和压缩工具
图像格式有许多种不同类型,在互联网上最常见的有JPEG.GIF.BMP.TIFF和PNG.每一种图像格式都有它自己的用途,比如GIF是用于动画的,JPEG是用于高清图片的,这种图片在保存或者调整大小后 ...
- H5 学习笔记(一、关于position定位)
主要是relative与absolute的用法: 1.relative 依据left right top bottom 等属性在正常文档流中脱离位置,即相对于他的正常文档流位置进行移动.两个都为rel ...
- java 文件按行读取
/*代码写的可能有点累赘里面的好多东西写的不太好 还望各位大佬能提点一二,不胜感激*/package com.zzp.fileopration;import java.io.*;/** * Creat ...
- 保存配置文件的appSetting
/// <summary> /// 保存appSetting /// </summary> /// <param name="key">appS ...
- C++调用约定和名字约定
C++调用约定和名字约定 转自http://www.cppblog.com/mzty/archive/2007/04/20/22349.html 调用约定:__cdecl __fastcall与 __ ...