hdu 5044 树链剖分
转载: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 树链剖分的更多相关文章
- hdu 5893 (树链剖分+合并)
List wants to travel Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/O ...
- hdu 5052 树链剖分
Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- hdu 4897 树链剖分(重轻链)
Little Devil I Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- hdu 5274 树链剖分
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- HDU 3966 (树链剖分+线段树)
Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...
- hdu 3966(树链剖分+线段树区间更新)
传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...
- HDU 3966 /// 树链剖分+树状数组
题意: http://acm.hdu.edu.cn/showproblem.php?pid=3966 给一棵树,并给定各个点权的值,然后有3种操作: I x y z : 把x到y的路径上的所有点权值加 ...
- hdu 4729 树链剖分
思路:这个树链剖分其实还是比较明显的.将边按权值排序后插入线段树,然后用线段树查找区间中比某个数小的数和,以及这样的数的个数.当A<=B时,就全部建新的管子. 对于A>B的情况比较 建一条 ...
- hdu 3966 树链剖分
思路:树链剖分入门题,我这门入得好苦啊,程序很快写出来了,可是在LCA过程中把update函数里的左右边界位置写反了,一直RE到死. #pragma comment(linker, "/ST ...
随机推荐
- ASP.NET CORE 使用 EF CORE访问数据库
asp.net core通过ef core来访问数据库,这里用的是代码优先,通过迁移来同步数据库与模型. 环境:vs2017,win10,asp.net core 2.1 一.从建立asp.net c ...
- sqlserver事务隔离
事务是一个工作单元,可能包含查询和修改数据以及修改数据定义等多个活动.我们可以显式或隐式的定义事务边界.可以使用BEGIN TRAN或者BEGIN TRANSACTION语句显式的定义事务的开始.如果 ...
- 快速体验openstack-用devstack安装openstack
官网安装说明: --2014年11月15日14:14:21 安装环境:Ubuntu12.04,安装官网的说明遇到了小问题,记录在这里 --http://docs.openstack.org/devel ...
- c# -反射 初见
反射是一个很强大的功能,不过好像有些消耗性能,大家慎重使用. 1.反射是干什么的? 通过反射,我们可与获取程序集中的原数据. 1.什么是程序集? dll.exe 这些将很多能实现具体功能的代码封装起 ...
- [BZOJ1009][HNOI2008]GT考试 DP+矩阵快速幂+KMP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1009 我们令$dp(i,j)$表示已经填了$i$位,而且后缀与不幸运数字匹配了$j$位,那 ...
- css中display设置为table、table-row、table-cell后的作用及其注意点
html: <div class="table"> <div class="row"> <div class="cell ...
- 日常记录-代码中Background后Padding 失效
近日,在开发过程中 遇到了 Layout 代码中设置 Background 后,padding失效的问题,只是在Android 4.4.4 和 4.4.2 的手机上遇到了. 网上搜索了下,说是 4.4 ...
- linux下php访问sql server设置
安装freeIDS 官网下载地址: wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.00.18.tar.gz 1.1.到下载目录解压 t ...
- windows环境开启PHP fileinfo扩展
fileinfo作用:本模块中的函数通过在文件的给定位置查找特定的 魔术 字节序列 来猜测文件的内容类型以及编码(通俗来讲就是获取文件的MIME信息) 开启PHP fileinfo扩展的方法: 1.下 ...
- JavaSE-18 常用工具类
学习要点 Object类 枚举 包装类 Math类 Random类 字符串处理 日期时间 Object类 1 什么是Object类 Object类存储在java.lang包中,是所有java类(Ob ...