昨天写了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. Page.ClientScript.RegisterStartupScript函数的使用

    Page.ClientScript.RegisterStartupScript(type,key,script,addScriptTags);type要注册的启动脚本的类型.key要注册的启动脚本的键 ...

  2. nRF51 DFU 初始化包介绍及生成工具

    nRF51 DFU 初始化包 当升级数据包时,在应用程序映像传输之前,在DFU中需要初始化包来执行映像的安全检测.这个初始化包作为升级流程的一部分提供了安全检测机制,因此被升级的设备只能接收兼容的应用 ...

  3. linux内核学习之三:linux中的"32位"与"64位"

    在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位"与"64位"的说法,类似的还有"x86"与"x86 ...

  4. javascript中的一些基本方法收藏

    W3C DOM 什么是DOM,DOM其实就是把一个HTML或者XML等符合W3C标准的文档内容模拟成一个JAVA对象,这样才能给JAVA或者JS来操作.下面是JS中模拟出的内置DOM对象documen ...

  5. ural 1017. Staircases

    http://acm.timus.ru/problem.aspx?space=1&num=1017 #include <cstdio> #include <cstring&g ...

  6. #if defined 的意思?

    在读s3c2440a的test程序,其中option.h文件中有段语句为: #define LCD_N35 //#define LCD_L80 //#define LCD_T35 //#define ...

  7. CentOS下Qt窗口透明效果失效,成黑色背景的问题

    一.问题 Linux系统下Qt窗口的透明效果成了黑色,但同样的代码在windows机子上有透明效果,主要是修改系统的配置,仅在centos6.3及其以上版本实验过.其他系统可以相应配置. 二.问题运行 ...

  8. ANDROID (eclipse)开发常见问题及解决办法汇总

    1.ANDROID 在eclipse中没有出现AVD的解决方法(转)如果android安装正确的话,但是eclipse里面的导航条就是没有AVD 可以通过「Window」⇒「Customize Per ...

  9. BZOJ1106: [POI2007]立方体大作战tet

    1106: [POI2007]立方体大作战tet Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 419  Solved: 302[Submit][St ...

  10. android ListView用法介绍

    ListView在Android开发中是比较常用的组件,它是以列表的形式展示内容,并且还可以处理用户的选择与点击等操作: LIstView显示数据一般需要三方面: (1)ListView组件:用来展示 ...