转载:http://blog.csdn.net/qinzhenhua100/article/details/39716851

二种操作,一种更新结点值,一种更新路径值,最后输出更改后的结点值和路径值。

对于区间[a,b],区间的每个值加上c,可以用一个数组标记,ans[a]+=c,ans[b+1]-=c;然后下标从a,遍历到b,把所有的ans[]值加上,就等于当前结点修改后的值。注意两点,一是手动扩栈,二是最终的结果用64位。

#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define N 100010
struct pp
{
int u,v;
}ed[N];
struct node
{
int u,v,next;
}bian[N*2];
int e,id,dep[N],son[N],father[N],sz[N],ti[N],mark1[N],mark2[N],top[N],head[N];
__int64 a[N],b[N],ans1[N],ans2[N];
void add(int u,int v)
{
bian[e].u=u;
bian[e].v=v;
bian[e].next=head[u];
head[u]=e++;
}
void dfs1(int u,int fa)
{
int i,v;
dep[u]=dep[fa]+1; son[u]=0; father[u]=fa; sz[u]=1;
for(i=head[u];i!=-1;i=bian[i].next)
{
v=bian[i].v;
if(v==fa) continue;
dfs1(v,u);
sz[u]+=sz[v];
if(sz[son[u]]<sz[v])
son[u]=v;
}
}
void dfs2(int u,int fa)
{
int i,v;
ti[u]=id++;
mark1[id-1]=u;
top[u]=fa;
if(son[u]!=0)
dfs2(son[u],fa);
for(i=head[u];i!=-1;i=bian[i].next)
{
v=bian[i].v;
if(v==father[u]||v==son[u])
continue;
dfs2(v,v);
}
}
void getnode(int u,int v,int k)
{
while(top[u]!=top[v])
{
if(dep[top[u]]>dep[top[v]])
swap(u,v);
a[ti[top[v]]]+=k;
a[ti[v]+1]-=k;
v=father[top[v]];
}
if(ti[u]>ti[v])
swap(u,v);
a[ti[u]]+=k;
a[ti[v]+1]-=k;
}
void getedge(int u,int v,int k)
{
while(top[u]!=top[v])
{
if(dep[top[u]]>dep[top[v]])
swap(u,v);
b[ti[top[v]]]+=k;
b[ti[v]+1]-=k;
v=father[top[v]];
}
if(ti[u]>ti[v])
swap(u,v);
if(u!=v)
{
b[ti[u]+1]+=k;
b[ti[v]+1]-=k;
}
}
int main()
{
int t,cnt=1,n,m,i,u,v,k;
__int64 s;
char str[10];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
memset(head,-1,sizeof(head));
memset(b,0,sizeof(b));
e=0;
for(i=1;i<n;i++)
{
scanf("%d%d",&ed[i].u,&ed[i].v);
add(ed[i].u,ed[i].v);
add(ed[i].v,ed[i].u);
}
sz[0]=0; id=1; dep[1]=0;
dfs1(1,1);
dfs2(1,1);
for(i=1;i<=m;i++)
{
scanf("%s%d%d%d",str,&u,&v,&k);
if(strcmp(str,"ADD1")==0)
getnode(u,v,k);
else
getedge(u,v,k);
}
for(i=1;i<n;i++)
{
if(dep[ed[i].u]<dep[ed[i].v])
mark2[ti[ed[i].v]]=i;
else
mark2[ti[ed[i].u]]=i;
}
printf("Case #%d:\n",cnt++);
s=0;
for(i=1;i<=n;i++)
{
s+=a[i];
ans1[mark1[i]]=s;
}
for(i=1;i<=n;i++)
{
if(i==1)
printf("%I64d",ans1[i]);
else
printf(" %I64d",ans1[i]);
}
printf("\n");
s=0;
for(i=2;i<=n;i++)
{
s+=b[i];
ans2[mark2[i]]=s;
}
for(i=1;i<n;i++)
{
if(i==1)
printf("%I64d",ans2[i]);
else
printf(" %I64d",ans2[i]);
}
printf("\n");
}
return 0;
}

hdu 5044 树链剖分的更多相关文章

  1. hdu 5893 (树链剖分+合并)

    List wants to travel Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

  2. hdu 5052 树链剖分

    Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  3. hdu 4897 树链剖分(重轻链)

    Little Devil I Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  4. hdu 5274 树链剖分

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  5. HDU 3966 (树链剖分+线段树)

    Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...

  6. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  7. HDU 3966 /// 树链剖分+树状数组

    题意: http://acm.hdu.edu.cn/showproblem.php?pid=3966 给一棵树,并给定各个点权的值,然后有3种操作: I x y z : 把x到y的路径上的所有点权值加 ...

  8. hdu 4729 树链剖分

    思路:这个树链剖分其实还是比较明显的.将边按权值排序后插入线段树,然后用线段树查找区间中比某个数小的数和,以及这样的数的个数.当A<=B时,就全部建新的管子. 对于A>B的情况比较 建一条 ...

  9. hdu 3966 树链剖分

    思路:树链剖分入门题,我这门入得好苦啊,程序很快写出来了,可是在LCA过程中把update函数里的左右边界位置写反了,一直RE到死. #pragma comment(linker, "/ST ...

随机推荐

  1. C#连接数据库_使用读取配置文件的方式

    using System; using System.Collections.Generic; using System.Configuration; using System.Data.SqlCli ...

  2. Apollo源码搭建调试看一文就够

    Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景. 我 ...

  3. 《基于Node.js实现简易聊天室系列之项目前期工作》

    前期工作主要包括:项目的创建,web服务器的创建和数据库的连接. 项目创建 网上关于Node.js项目的创建的教程有很多,这里不必赘述.Demo所使用的Node.js的框架是express,版本为4. ...

  4. SOA测试之浏览器插件

    1. Chrome HTTP Rest Client 插件: 1.1 Postman: https://chrome.google.com/webstore/detail/postman-rest-c ...

  5. 富文本KindEditor使用

    1.官网down KindEditor,添加到自己的项目中:添加时可把不需要的文件夹干掉,asp/php等等.我的项目用的是纯html和js,直接调用后台api: 2.页面引入相关js.eclipse ...

  6. Java处理ZIP文件的解决方案——Zip4J(不解压直接通过InputStream形式读取其中的文件,解决中文乱码)

    一.JDK内置操作Zip文件其实,在JDK中已经存在操作ZIP的工具类:ZipInputStream. 基本使用: public static Map<String, String> re ...

  7. Zend Studio / Eclipse 缩进设置

    首先是Window – Preferences打开Preferences配置对话框: 然后依次找到PHP – Code Style – Formatter,如下图所示: 这里注意一下Active pr ...

  8. new Buffer 生成二进制数据

    node编辑环境下: > new Buffer("admin")<Buffer 61 64 6d 69 6e> 通过post请求,服务端接收到是流数据,必须把流数 ...

  9. CAD交互绘制圆弧(com接口)

    在CAD设计时,需要绘制圆弧,用户可以在图面点圆弧起点,圆弧上的一点和圆弧的终点,这样就绘制出圆弧. 主要用到函数说明: _DMxDrawX::DrawArc2 由圆弧上的三点绘制一个圆弧.详细说明如 ...

  10. windows开发错误

    2018/07/16: 1.问题: 代码: list <int> listN; error C2065:'list' : undeclared identifier 我已经#include ...