昨天写了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. google反向代理网址收集

    前言 亲,还在为谷歌被墙而懊恼么?还在苦苦搜集FQ手段么?往下看吧? 最近在网站链接来源统计中,发现了很多反向代理了谷歌的链接,故搜集在这里,供需要的人使用,使用如下链接谷歌搜素不需要FQ哦?下面地址 ...

  2. Swift数据类型之整型和浮点型-备

    Swift提供8.16.32.64位形式的有符号及无符号整数.这些整数类型遵循C语言的命名规约,我归纳了Swift中的整型: 整型示例: print("UInt8 range: \(UInt ...

  3. repo init 时gpg: 无法检查签名:找不到公钥

    i found a solution here: http://www.marshut.com/wrrts/repo-release-1-12-4.html Sorry, I realized tod ...

  4. Android Activity 生命周期的透彻理解

    说来惭愧,虽然已经做了一年多的android开发,但是最近被人问起activity的生命周期的时候,却感觉自己并不能很自信很确定的回答对方的问题,对activity的生命周期的理解还不透彻啊.     ...

  5. hdu Number Sequence

    这道题是寻找规律.别的方法一般都是超时. #include <cstdio> #include <cstring> #include <algorithm> usi ...

  6. 【转】win7+ubuntu双系统安装方法--不错

    原文网址:http://blog.csdn.net/lvanneo/article/details/16885121 前段时间又安装一下win7+ubuntu双系统,过段时间就会忘记,这次自己写下来, ...

  7. poj3667---Hotel 线段树区间合并,区间更新

    题意:有N个房间,M次操作.有两种操作(1)"1 a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示入住.(2)"2 b len",把起点为b ...

  8. day54

    今天复习时间15个小时 那都做了什么呢 数学2000试卷 阅读2篇整理 翻译2个视频 政治背诵加视频 数学综合5个证明 作文两篇 c语言结构体以及简单总结 博客园日记 数据结构 好了 感觉也没有做什么 ...

  9. Entify Framewrok - 学习链接

    http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading- ...

  10. 获取java类和方法名

    String clazz = this.getClass().getName(); String method = Thread.currentThread() .getStackTrace()[1] ...