HDU 5044 离线LCA算法
昨天写了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算法的更多相关文章
- 【图论】tarjan的离线LCA算法
百度百科 Definition&Solution 对于求树上\(u\)和\(v\)两点的LCA,使用在线倍增可以做到\(O(nlogn)\)的复杂度.在NOIP这种毒瘤卡常比赛中,为了代码的效 ...
- HDU 5044 Tree LCA
题意: 给出一棵\(n(1 \leq n \leq 10^5)\)个节点的树,每条边和每个点都有一个权值,初始所有权值为0. 有两种操作: \(ADD1 \, u \, v \, k\):将路径\(u ...
- 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 ...
- 近期公共祖先(LCA)——离线Tarjan算法+并查集优化
一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...
- POJ 1330 LCA最近公共祖先 离线tarjan算法
题意要求一棵树上,两个点的最近公共祖先 即LCA 现学了一下LCA-Tarjan算法,还挺好理解的,这是个离线的算法,先把询问存贮起来,在一遍dfs过程中,找到了对应的询问点,即可输出 原理用了并查集 ...
- HDU 2586 How far away ? 离线lca模板题
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 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 ...
- LCA算法
LCA算法: LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点.也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共 ...
- hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]
传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...
随机推荐
- 《javascript设计模式》--接口
关于javascript设计模式书中的接口,记录如下 //TODO 增加了一个判断条件,可以只在生产环境中调用 接口var Interface = function(name,methods){ i ...
- Python同时向控制台和文件输出日志logging的方法 Python logging模块详解
Python同时向控制台和文件输出日志logging的方法http://www.jb51.net/article/66756.htm 1 #-*- coding:utf-8 -*- 2 import ...
- 【分享】JS图片滑动渐显渐隐插件-附使用方法。
前阵子总监要说做一个邀请函 效果 点击这里 鼠标拖拽进行浏览 它用的是Adobe edge软件生成的,代码量过大,冗余太多. 再加上我也没学过这个软件怎么使用,增加学习成本影响项目进度. 于是就自己写 ...
- 学习npm和gulp的一些资料,先记着明天接着学习
Unix命令行程序和内建指令(百度百科) 将less编译成css的gulp插件 淘宝cnpm镜像 gulp教程之gulp-less gulp入门指南 查找npm的package.json的name配置 ...
- QM项目开发文档整理
QM项目开发文档整理 前言 在W公司工作4个多月,庆幸接触到的全是"硬"项目,真枪实干,技术.经验.能力都得到了很大提升. QM项目 此项目WEB前端学到的东西很多,对PHP项目的 ...
- 使用redis缓存加索引处理数据库百万级并发
使用redis缓存加索引处理数据库百万级并发 前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1 ...
- 为什么ELF文件的加载地址是0x8048000
在一个进程的虚拟地址空间中,ELF文件是从0x8048000这个地址开始加载的,为什么会是这个地址? 回答:用命令ld --verbose可以看到0x08048000,ld的默认脚本用这个地址作为EL ...
- spring动画-iOS-备
最后停止在终点: 如果给位置移动的动画添加弹簧效果,那么视图的运动轨迹应该像下图中展现的一样: 这会使你的动画看起来更逼真.更真实.更贴近现实.在某些情况下带给用户更好的用户体验.那么让我们开始学习吧 ...
- SMTP协议--在cmd下利用命令行发送邮件
先简单介绍下smtp smtp使用命令和应答在客户与服务器之间传输报文.即客户发出一个命令,服务器返回一个应答.发送方与接收方进行一问一答的交互,由发送方控制这个对话. 在XP系统下点‘开始’-‘运行 ...
- 自制单片机之六……串行I2C总线E2PROM AT24CXXX的应用
这一篇介绍I2C存储器的使用.主要是介绍AT24CXX系列器件,它分为两类,主要是通过被存储容量地址来分的,一类是AT24C02-AT24C16,它的存储容量从256字节到2048字节.另一类是AT2 ...