昨天写了HDU 3966 ,本来这道题是很好解得,结果我想用离线LCA 耍一把,结果发现离线LCA 没理解透,错了好多遍,终得AC ,这题比起 HDU 3966要简单,因为他不用动态查询。但是我还是错了好多遍  T^T。。。

http://acm.split.hdu.edu.cn/showproblem.php?pid=5044

不多说了  思想不是很清楚的可以看一看我的上一篇博文 HDU 3966

直接贴代码

 #include<iostream>
#include<stdio.h>
#include<string.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<stdlib.h>
#include <vector>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define ll __int64
#define CL(a,b) memset(a,b,sizeof(a))
#define MAXNODE 100010 int n,q; typedef struct myedge
{
int v,next,p;
}E; E edge[MAXNODE*];
int head[MAXNODE],ce; void inithead()
{
CL(head,-);
ce=;
}
void addedge(int s,int e,int p)
{
edge[ce].p=p;edge[ce].v=e;edge[ce].next=head[s];head[s]=ce++;
edge[ce].p=p;edge[ce].v=s;edge[ce].next=head[e];head[e]=ce++;
} typedef struct opedge
{
int v,t,k,p,next;
}O; O op[MAXNODE*];
int heado[MAXNODE],co;
int etn[MAXNODE]; void initheado()
{
CL(heado,-);
CL(etn,);
co=;
} void addo(int s,int e,int t,int k,int p)
{
op[co].t=t;op[co].v=e;op[co].next=heado[s];op[co].p=p;op[co].k=k;heado[s]=co++;
op[co].t=t;op[co].v=s;op[co].next=heado[e];op[co].p=p;op[co].k=k;heado[e]=co++;
} int fa[MAXNODE];
int fifa(int i)
{
if(fa[i]==i)return i;
fa[i]=fifa(fa[i]);
return fa[i];
} int pre[MAXNODE];
int tagp[MAXNODE];
ll re[MAXNODE][];
int tag[MAXNODE]; void initdfs()
{
CL(pre,-);
CL(tagp,);
CL(tag,);
CL(re,);
for(int i=;i<MAXNODE;i++)fa[i]=i;
} void dfsad(int i,int pr)
{
pre[i]=pr;
int p=head[i],v,t,k,pos,rt;
while(p!=-)
{
v=edge[p].v;
if(pre[v]==-)
{
etn[edge[p].p]=v;
dfsad(v,i);
}
p=edge[p].next;
}
tag[i]=;
p=heado[i];
while(p!=-)
{
v=op[p].v;
t=op[p].t;
k=op[p].k;
rt=fifa(v);
if(tag[v]==&&tagp[op[p].p]==)
{
re[i][t]+=k;re[v][t]+=k;
re[rt][t]-=k;
if(t==)
{
re[pre[rt]][t]-=k;
}
else re[rt][t]-=k;
tagp[op[p].p]=;
}
p=op[p].next;
}
fa[i]=pr;
} void dfs(int i,int pr)
{
tag[i]=;
int p=head[i],v;
while(p!=-)
{
v=edge[p].v;
if(tag[v]==)dfs(v,i);
p=edge[p].next;
}
re[pr][]+=re[i][];
re[pr][]+=re[i][];
} char opt[]; int main()
{
int tt,ii;
cin>>tt;
for(ii=;ii<=tt;ii++)
{
scanf("%d %d",&n,&q);
int i,j,a,b,k;
inithead();
initheado();
initdfs();
for(i=;i<n;i++)
{
scanf("%d %d",&a,&b);
addedge(a,b,i);
}
for(i=;i<=q;i++)
{
scanf("%s %d %d %d",opt,&a,&b,&k);
{
if(opt[]=='')
{
addo(a,b,,k,i);
}
else
{
addo(a,b,,k,i);
}
}
}
dfsad(,);
CL(tag,);
dfs(,);
printf("Case #%d:\n",ii);
for(i=;i<=n;i++)
{
if(i!=)printf(" ");
printf("%I64d",re[i][]);
}cout<<endl;
for(i=;i<n;i++)
{
if(i!=)printf(" ");
printf("%I64d",re[etn[i]][]);
}cout<<endl;
}
return ;
}

HDU 5044 离线LCA算法的更多相关文章

  1. 【图论】tarjan的离线LCA算法

    百度百科 Definition&Solution 对于求树上\(u\)和\(v\)两点的LCA,使用在线倍增可以做到\(O(nlogn)\)的复杂度.在NOIP这种毒瘤卡常比赛中,为了代码的效 ...

  2. HDU 5044 Tree LCA

    题意: 给出一棵\(n(1 \leq n \leq 10^5)\)个节点的树,每条边和每个点都有一个权值,初始所有权值为0. 有两种操作: \(ADD1 \, u \, v \, k\):将路径\(u ...

  3. hdu 2586 How far away?(LCA模板题+离线tarjan算法)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. 近期公共祖先(LCA)——离线Tarjan算法+并查集优化

    一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...

  5. POJ 1330 LCA最近公共祖先 离线tarjan算法

    题意要求一棵树上,两个点的最近公共祖先 即LCA 现学了一下LCA-Tarjan算法,还挺好理解的,这是个离线的算法,先把询问存贮起来,在一遍dfs过程中,找到了对应的询问点,即可输出 原理用了并查集 ...

  6. HDU 2586 How far away ? 离线lca模板题

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. SPOJ 10628 Count on a tree(Tarjan离线LCA+主席树求树上第K小)

    COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to  ...

  8. LCA算法

    LCA算法: LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点.也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共 ...

  9. hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]

    传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...

随机推荐

  1. 《HTML5经典坦克大战》游戏(代码)

    前几天粗略地学了HTML5,然后就用它写了一个<经典坦克大战>游戏. 现在想分享一下我写的代码,写得不好请大家多多指教. 给大家推荐一个网站,这个网站是为大学生而做,为方便学习编程的同学而 ...

  2. 个性A标签

    问题: 前段时间,小琳同学问我A标签为啥alert出来的是它的href? 示例: 先来两个标签比较一下. <a id="a" href="http://www.ba ...

  3. js href的用法

    关于js window.location.href location.href parent.location.href top.location.href 的用法 "window.loca ...

  4. C语言初学 数学中带根号的复杂计算问题

    #include<stdio.h> #include<math.h> int main() { double a,b; scanf("%lf%lf",&am ...

  5. c语言,全局变量,局部变量,外部函数,内部函数,stasic和extern的复习总结

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  6. cf B. Road Construction

    http://codeforces.com/contest/330/problem/B这道题可以围着一个可以与任何一个城市建路的城市建设. #include <cstdio> #inclu ...

  7. 如何用VS2010打开VS2012编辑的项目

    找到打开项目的开始图标:,右键点击,选择有文本编辑器打开,用下面的语句将文件里面的前两句替换掉.​Microsoft Visual Studio Solution File, Format Versi ...

  8. java集合经常出现空指针问题的解决方案

    我自己问自己这个问题的时候都把自己给雷住了,但是现实如此,经常写的程序就是出现空指针的错误. 如: public List add(){ List list=null; try { list=new ...

  9. Eclipse中安装TestNG插件

    在Eclipse中安装TestNG也像安装其他插件一样非常方便,如下: 选择菜单:Help->Install New Software,然后在弹出窗口中的“Work with”中输入地址: ht ...

  10. AS3排序

    package { import flash.display.Sprite; public class Sort extends Sprite { private var arr:Vector.< ...