昨天写了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. JQuery原理介绍及学习方法

    前言 对于JQuery,想必大家都很熟悉.目前,很多web项目,在实施的过程中,考虑到各浏览器原生JS API的兼容性,大都会选用JQuery或类似于JQuery这样的框架来进行网页效果开发.JQue ...

  2. 使用HTML5中的Canves标签制作时钟特效

    <!DOCTYPE html > <html> <head> </head> <body> <canvas id="cloc ...

  3. windows搭建redis记录

    windows安装redis:http://www.cnblogs.com/linjiqin/archive/2013/05/27/3101694.html 30个常用的redis命令:http:// ...

  4. PHP 中const 与define 区别

    1.const用于类成员变量定义,一旦定义且不能改变其值.define定义全局常量,在任何地方都可以访问. 2.define不能在类中定义而const可以. 3.const不能在条件语句中定义常量 i ...

  5. Python学习笔记总结(四)异常处理

    1.基础 try/except/else:[else是可选的]捕捉由代码中的异常并恢复,匹配except里面的错误,并执行except中定义的代码,后继续执行程序(发生异常后,由except捕捉到异常 ...

  6. iOS自动打发布包-备用

    #!/bin/bash #  autoPublishH.sh#  ##  Created by 刘志托 liu on 12-2-8.#  Copyright (c) 2012年 null. All r ...

  7. Gradle Android客户端程序打包(基于gradle 1.12版本验证通过)

    一.前言 android客户端开发进入尾声,负责SEO同事突然发给我一个涉及45个发布渠道的噩耗,之前只发布自有渠道的工作方式(手动修改参数打包)已经不满足需求,所以引入最近比较流行的gradle打包 ...

  8. cf E. Neatness

    http://codeforces.com/contest/359/problem/E 题意:要关掉所有房间的灯,一个步骤要么开灯,要么关灯,要么向有灯的方向前进一格.输出一种关掉所有灯的方案.不能关 ...

  9. Powershell使用管道

    管道并不是什么新事物,以前的Cmd控制台也有重定向的命令,例如Dir | More可以将结果分屏显示.传统的Cmd管道是基于文本的,但是Powershell是基于对象. PS> ls | Sor ...

  10. 关于老驱动不能在windows 8下正常安装的问题

    问题: 老驱动(WDF),能在windows 7下安装并工作,但是不能在windows 8下安装. 先了解下windows 8驱动的新东西吧: New for windows 8 http://msd ...