HDU 5044 TREE
题意:一棵树上两种操作,操作1,改变u到v的每一点的值增加k,操作2,改变u到v每一条边值增加k。最后结束时问,每一点和每一条边的值。
初始时,点和边的值都为0.
分析:
很显然要用树链剖分,将点和边分别划分成连续一段的编号,然后就是维护一段一段的值了,给它增加一个值,由于题目只需要输出最后结果,那么可以用树桩数组维护。
以边为例,对于l~r的每个值增加k,利用树桩数组v[i]表示第i个值与前一个值的差值,那么第k条边的值就是sum{v[i]| 1 <= i <= k},更新时则只要给v[l]加k,给v[r+1]加(- k), 这个都可以累加下来,最后依次对每个v[i]更新,然后求出结果就行了。
代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <cstring>
#include <set>
#include <bitset>
#include <cstdio>
#include <cmath>
#define esp 1e-8
#pragma comment(linker, "/STACK:102400000,102400000")
#define in freopen("F:\\rootial\\data\\data.txt", "r", stdin);
#define IN freopen("solve_in.txt", "r", stdin);
#define out freopen("out.txt", "w", stdout);
#define pf(x) ((x)*(x))
#define lowbit(x) ((x)&(-(x)))
#define bug(x) printf("Line %d: >>>>>>\n", (x));
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define pb push_back
#define mp make_pair
#define pi acos(-1.0)
#define pf(x) ((x)*(x)) using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef map<LL, LL> MPS;
typedef MPS::iterator IT; const int maxn = (int)1e5 + ;
LL vv[][maxn];
int n, m;
int top[maxn], num[maxn], tnum[maxn], ID[maxn], son[maxn], sz[maxn], fa[maxn], dep[maxn], tmp[maxn];
int cnt; struct Edge
{
int v, id;
Edge() {}
Edge(int v, int id):v(v), id(id) {}
} edge[maxn*];
int fi[maxn], nxt[maxn*];
LL q[][maxn]; void update(int x, LL v[], LL val)
{
while(x <= n)
{
v[x] +=val;
x += lowbit(x);
}
}
void update(int l, int r, LL val, LL v[])
{
update(l, v, val);
update(r+, v, -val);
} void query(int x, LL &res1, LL &res2)
{
res1 = , res2 = ;
while(x > )
{
res1 += vv[][x];
res2 += vv[][x];
x -= lowbit(x);
}
}
void dfs1(int u, int f)
{
fa[u] = f;
dep[u] = dep[f] + ;
sz[u] = ;
for(int i = fi[u]; i; i = nxt[i])
{
int v = edge[i].v;
int id = edge[i].id;
if(v == f)
continue;
tmp[v] = id;
dfs1(v, u);
sz[u] += sz[v];
if(sz[son[u]] < sz[v])
son[u] = v;
}
}
void dfs2(int u, int f)
{
if(son[u])
{
num[son[u]] = ++cnt;
top[son[u]] = top[u];
ID[tmp[son[u]]] = cnt;
dfs2(son[u], u);
}
for(int i = fi[u]; i; i = nxt[i])
{
int v = edge[i].v;
int id = edge[i].id;
if(v == f || v == son[u]) continue;
top[v] = v;
num[v] = ++cnt;
ID[tmp[v]] = cnt;
dfs2(v, u);
}
}
void init()
{
for(int i = ; i <= n; i++)
{
vv[][i] = vv[][i] = ;
son[i] = ;
sz[i] = ;
fa[i] = ;
cnt = ;
fi[i] = ;
nxt[i<<] = nxt[i<<|] = ;
q[][i] = q[][i] = ;
}
}
void add(int u, int v, int x)
{
edge[++cnt] = Edge(v, x);
nxt[cnt] = fi[u];
fi[u] = cnt;
edge[++cnt] = Edge(u, x);
nxt[cnt] = fi[v];
fi[v] = cnt;
}
void input()
{
scanf("%d%d", &n, &m);
init();
for(int i = ; i < n; i++)
{
int u, v;
scanf("%d%d", &u, &v);
add(u, v, i);
}
cnt = ;
}
inline bool isdigit(char ch)
{
return ch >= '' && ch <= '';
}
const LL B = (int)1e5 + ; void update(int u, int v, int k) //dian
{
while(top[u] != top[v])
{
if(dep[top[u]] < dep[top[v]]) swap(u, v);
q[][num[top[u]]] += k;
q[][num[u]+] -= k;
u = fa[top[u]];
}
if(dep[u] < dep[v]) swap(u, v);
q[][num[v]] += k;
q[][num[u]+] -= k;
}
void update1(int u, int v, int k) //bian
{
while(top[u] != top[v])
{
if(dep[top[u]] < dep[top[v]]) swap(u, v);
if(u != top[u])
{
q[][num[son[top[u]]]] += k;
q[][num[u]+] -= k;
}
u = top[u];
q[][num[u]] += k;
q[][num[u]+] -= k;;
u = fa[u];
}
if(dep[u] < dep[v]) swap(u, v);
if(u != v)
{
q[][num[son[v]]] += k;
q[][num[u]+] -= k;
}
}
LL ans[maxn]; void solve()
{
dfs1(, );
top[] = ;
num[] = ++cnt;
dfs2(, );
for(int i = ; i < m; i++)
{
char s[];
int u, v, k;
scanf("%s%d%d%d", s, &u, &v, &k);
if(strcmp(s, "ADD1") == )
{
update(u, v, k);
}
else
{
update1(u, v, k);
}
}
for(int k = ; k < ; k++){
for(int i = ; i <= n; i++)
update(i, vv[k], q[k][i]);
} for(int i = ; i <= n; i++)
{
LL res1, res2;
query(num[i], res1, res2);
ans[num[i]] = res2;
printf("%I64d%c", res1, i == n ? '\n' : ' ');
}
for(int i = ; i <= n-; i++)
{
LL res = ans[ID[i]];
printf("%I64d%c", res, i == n- ? '\n' : ' ');
}
if(n == )
puts("");
}
int main()
{ int T;
for(int t = scanf("%d", &T); t <= T; t++)
{
printf("Case #%d:\n", t);
input();
solve();
}
return ;
}
HDU 5044 TREE的更多相关文章
- HDU 5044 Tree(树链剖分)
HDU 5044 Tree field=problem&key=2014+ACM%2FICPC+Asia+Regional+Shanghai+Online&source=1&s ...
- HDU 5044 Tree 树链剖分+区间标记
Tree Problem Description You are given a tree (an acyclic undirected connected graph) with N nodes. ...
- HDU 5044 Tree --树链剖分
题意:给一棵树,两种操作: ADD1: 给u-v路径上所有点加上值k, ADD2:给u-v路径上所有边加上k,初始值都为0,问最后每个点和每条边的值,输出. 解法:树链剖分可做,剖出来如果直接用线段树 ...
- HDU 5044 Tree LCA
题意: 给出一棵\(n(1 \leq n \leq 10^5)\)个节点的树,每条边和每个点都有一个权值,初始所有权值为0. 有两种操作: \(ADD1 \, u \, v \, k\):将路径\(u ...
- hdu 5909 Tree Cutting [树形DP fwt]
hdu 5909 Tree Cutting 题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数 \(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数 ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
- HDU 4757 Tree(可持久化Trie+Tarjan离线LCA)
Tree Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) Total Su ...
- HDU 5044 (树链剖分+树状数组+点/边改查)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5044 题目大意:修改链上点,修改链上的边.查询所有点,查询所有边. 解题思路: 2014上海网赛的变 ...
- HDU 4757 Tree 可持久化字典树
Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4757 Des ...
随机推荐
- 移动硬盘安装linux系统小记
由于某种原因,笔记本电脑不在身边,因教学需要必须进行电脑展示教学,所以就有了如下的做法,写下来也是为以后方便吧.-- 目前手头有移动硬盘,怎么样才能实现用移动硬盘进行教学呢?!!! 机房若干台机器都是 ...
- python出现Non-ASCII character '\xe7' in file ex6.py on line 1, but no encoding declare错误
http://www.cnblogs.com/qi09/archive/2012/02/06/2340712.html python中出现Non-ASCII character '\xe7' in f ...
- Cisco交换机中的flash,Rom,RAM,nvram的区别
Flash内存,也叫闪存,是路由器当中常用的一种内存类型.它是可读写的存储器,在系统重新启动或关机之后仍能保存数据.Flash中存放着当前使用中的IOS(路由器操作系统). 只读内存(ROM)在Cis ...
- iOS Core Animation学习总结(2)--实现自定义图层
一. 创建图层继承于CALayer,并在子类实现drawInContext方法 @interface CTLayer : CALayer @end @implementation CTLayer -( ...
- JS中null与undefined的区别
1.typeof操作符 用来检测变量的数据类型 例:typeof 3.14 //返回number typeof [1,2,3] //返回object 2.null 只有一个值的特殊类型,表示一个空对 ...
- Lisp与JAVA的酷毙结合——abcl
最近看了一本叫做<黑客与画家>的书,其中对于Lisp语言大加褒奖.自己试着用了一下,虽然确实有反人类之嫌,但是确实是一门不错的语言,New Architect杂志上有一篇介绍ITA软件公司 ...
- OC1_汉字拼音转换 练习
// // WordManager.h // OC1_汉字拼音转换 // // Created by zhangxueming on 15/4/27. // Copyright (c) 2015年 z ...
- 性能更好的js动画实现方式——requestAnimationFrame
本文转载,原文地址:http://www.cnblogs.com/2050/p/3871517.html 用js来实现动画,我们一般是借助setTimeout或setInterval这两个函数,css ...
- bzoj1002:[FJOI2007]轮状病毒
思路:一道很裸的生成树计数问题,然而要高精度,而且听说直接行列式求值会被卡精度,所以可以模拟行列式求值的过程得到递推公式:f[i]=3*f[i-1]-f[i-2]+2,证明详见vfk博客: http: ...
- 安装Apache Web 服务器软件
Apache下载地址:http://pan.baidu.com/s/1kTKCEOn 1: 右击安装 2: 3: 4: 5:安装成功: 6:测试在浏览器地址栏输入:localhost; 会出现一个页面 ...