HDU5044---Tree 树链剖分
大致题意:add1 u v u到v路径上所有点的权值加上k,add2 u 到v路径上所有边的权值加上k
最后输出所有点的权值,边的权值。。树链剖分预处理然后来个线性O(n)的操作。刚开始用线段树tle了.
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+;
struct
{
int to,next;
} e[maxn<<];
int head[maxn],edge;
void add(int x,int y)
{
e[edge].to = y;
e[edge].next = head[x];
head[x] = edge++;
} int son[maxn],fa[maxn],siz[maxn],dep[maxn];
void dfs1(int root)
{
siz[root] = ;
son[root] = ;
for (int i = head[root]; i > ; i = e[i].next)
{
if (fa[root] != e[i].to)
{
dep[e[i].to] = dep[root] + ;
fa[e[i].to] = root;
dfs1(e[i].to);
if (siz[son[root]] < siz[e[i].to])
son[root] = e[i].to;
siz[root] += siz[e[i].to];
}
}
}
int top[maxn],pos[maxn],fp[maxn],tot;
void dfs2(int root,int f)
{
top[root] = f;
pos[root] = tot++;
fp[pos[root]] = root;
if (son[root]>)
dfs2(son[root],top[root]);
for (int i = head[root]; i > ; i = e[i].next)
if (fa[root] != e[i].to && e[i].to != son[root])
dfs2(e[i].to,e[i].to);
}
ll addv[][maxn<<];
int k;
void pre_update(int ua,int ub,int cho)
{
int f1 = top[ua];
int f2 = top[ub];
while (f1 != f2)
{
if (dep[f1] < dep[f2])
swap(f1,f2),swap(ua,ub);
addv[cho][pos[f1]] += k;
addv[cho][pos[ua]+] -= k;
ua = fa[f1];
f1 = top[ua];
}
if (dep[ua] > dep[ub])
swap(ua,ub);
if (cho == )
addv[cho][pos[ua]] += k,addv[cho][pos[ub]+] -= k;
if (cho == )
addv[cho][pos[son[ua]]] += k,addv[cho][pos[ub]+] -= k;
}
int n,m,d[maxn][],link[maxn];
void init()
{
scanf ("%d%d",&n,&m);
int root = ;
dep[root] = fa[root] = ;
edge = tot = ;
memset(head,,sizeof(head));
memset(siz,,sizeof(siz));
memset(addv,,sizeof(addv));
for (int i = ; i < n; i++)
{
int u,v;
scanf ("%d%d",&u,&v);
d[i][] = u;
d[i][] = v;
add(u,v),add(v,u);
}
dfs1(root);
dfs2(root,root);
for (int i = ; i < n; i++)
{
if (dep[d[i][]] < dep[d[i][]])
swap(d[i][],d[i][]);
link[d[i][]] = i;
}
}
ll ans1[maxn],ans2[maxn];
int main(void)
{
//freopen("in.txt","r",stdin);
int t;
int cas = ;
scanf ("%d",&t);
while (t--)
{
init();
for (int i = ; i < m; i++)
{
char op[];
int u,v;
scanf ("%s%d%d%d",op,&u,&v,&k);
pre_update(u,v,op[]-'');
}
for (int i = ; i <= n; i++)
{
addv[][i] += addv[][i-];
addv[][i] += addv[][i-];
ans1[fp[i]] = addv[][i];
ans2[link[fp[i]]] = addv[][i];
}
printf("Case #%d:\n",cas++);
printf("%I64d",ans1[]);
for (int i = ; i <= n; i++)
{
printf(" %I64d",ans1[i]);
}
printf("\n");
if (n>)
printf("%I64d",ans2[]);
for (int i = ; i < n; i++)
{
printf(" %I64d",ans2[i]);
}
printf("\n");
}
return ;
}
HDU5044---Tree 树链剖分的更多相关文章
- hdu5044 Tree 树链拆分,点细分,刚,非递归版本
hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...
- Hdu 5274 Dylans loves tree (树链剖分模板)
Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...
- POJ3237 Tree 树链剖分 边权
POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...
- Query on a tree——树链剖分整理
树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...
- 【BZOJ-4353】Play with tree 树链剖分
4353: Play with tree Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 31 Solved: 19[Submit][Status][ ...
- SPOJ Query on a tree 树链剖分 水题
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...
- poj 3237 Tree 树链剖分
题目链接:http://poj.org/problem?id=3237 You are given a tree with N nodes. The tree’s nodes are numbered ...
- Codeforces Round #200 (Div. 1) D Water Tree 树链剖分 or dfs序
Water Tree 给出一棵树,有三种操作: 1 x:把以x为子树的节点全部置为1 2 x:把x以及他的所有祖先全部置为0 3 x:询问节点x的值 分析: 昨晚看完题,马上想到直接树链剖分,在记录时 ...
- poj 3237 Tree 树链剖分+线段树
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
- Aizu 2450 Do use segment tree 树链剖分+线段树
Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...
随机推荐
- S-Nim
http://acm.hdu.edu.cn/showproblem.php?pid=1536 SG经典题,不多说 // File Name: hdu1536.cpp // Author: bo_jwo ...
- animate.min.css 动画样式移动端存在的问题
使用animate.min.css可以使用很多动画效果,包括3D效果,现在也可以应用于HTML5手机移动端,使用切换效果的时候会导致页面出现卡顿现象,可以使用css3 transform 方法硬件加速 ...
- DB2完美卸载
会安装,也要会卸载.详细的安装说明不多,我这个我觉得写得还算全. 准备工作. 1.用 ps -ef|grep db2 找出db2安装目录 2. ./db2level 查出DB2的 ...
- HTTP Status 404(The requested resource is not available)的几种解决方法
原因:servlet没有配置正确 ,查看web.xml确认正确,以及自己的请求路径正确 在IE中提示“404”错误有以下三种情况 1.未部署Web应用 2.URL输入错误 排错方法: 首先,查看URL ...
- WIN32_FIND_DATA 循环获取文件大小BUG
今天在调试程序时发现一个 WIN32_FIND_DATA 的BUG,在循环读取一个目录下的图片文件时,发现结构体中 nFileSizeLow 和 nFileSizeHigh 值 == 0的情况.即能获 ...
- Linux安装Weblogic9.2
1.先确认安装的环境是不是LINUX AS 4 [root@yaoxj ~]# cat /etc/issue Red Hat Enterprise Linux AS release 4 (Nahant ...
- JavaScript的68个技巧一
1. 严格模式 在自己的项目中 你可以坚持只使用" 严格模式 " 或只使用" 非严格模式 "的策略.但如果你要编写健壮的代码应对各种各样的代码连接 你有两个可选 ...
- A.indexOf(array[i])表达的含义
userAgentInfo.indexOf(Agents[v]): //A.indexOf(array[i]):A元素是否存在于数组array里面:如果存在就会返回对应的下标,如果不存在则返回-1. ...
- IDEA - Project files cannot be watched (are they under network mount?)
在64位Linux系统上使用IDEA时遇到如下问题,启动时警告信息External file changes sync may be slow Project files cannot be watc ...
- Swift 循环、数组 字典的遍历
import Foundation // 数组声明 var arr = [String]() // 数组循环添加项 ...{ arr.append("Item \(index)") ...