题意:一棵树上两种操作,操作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的更多相关文章

  1. HDU 5044 Tree(树链剖分)

    HDU 5044 Tree field=problem&key=2014+ACM%2FICPC+Asia+Regional+Shanghai+Online&source=1&s ...

  2. HDU 5044 Tree 树链剖分+区间标记

    Tree Problem Description You are given a tree (an acyclic undirected connected graph) with N nodes. ...

  3. HDU 5044 Tree --树链剖分

    题意:给一棵树,两种操作: ADD1: 给u-v路径上所有点加上值k, ADD2:给u-v路径上所有边加上k,初始值都为0,问最后每个点和每条边的值,输出. 解法:树链剖分可做,剖出来如果直接用线段树 ...

  4. HDU 5044 Tree LCA

    题意: 给出一棵\(n(1 \leq n \leq 10^5)\)个节点的树,每条边和每个点都有一个权值,初始所有权值为0. 有两种操作: \(ADD1 \, u \, v \, k\):将路径\(u ...

  5. hdu 5909 Tree Cutting [树形DP fwt]

    hdu 5909 Tree Cutting 题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数 \(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数 ...

  6. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

  7. HDU 4757 Tree(可持久化Trie+Tarjan离线LCA)

    Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Su ...

  8. HDU 5044 (树链剖分+树状数组+点/边改查)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5044 题目大意:修改链上点,修改链上的边.查询所有点,查询所有边. 解题思路: 2014上海网赛的变 ...

  9. HDU 4757 Tree 可持久化字典树

    Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4757 Des ...

随机推荐

  1. ACM——五位以内的对称素数

    http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1026 五位以内的对称素数 时间限制(普 ...

  2. Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)

    前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...

  3. ios llvm and clang build tools

    1. 使用 libclan g或 clang 插件 包括( libclang 和  Clangkit) 备注: Clangkit,它是基于 clang 提供的功能,用 Objective-C 进行封装 ...

  4. 判断手机还是PC浏览器

    function goPAGE() { if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobi ...

  5. props验证

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Java基础从数组到集合之间关键字的区别!!!!

    1.&& 和 &区别和联系: 相同点 : 结果是一样的.       不同点 :如果使用双&号判断,如果说条件一为false,不会判断条件二,但是单&号会继续判 ...

  7. 新安装Eclipse后的一些配置

    配置护眼的背景色 Window-> Preferences-> General-> Editors-> Text Editors: Appearance color optio ...

  8. Codevs 1001 舒适的路线 2006年 NOIP全国联赛提高组

    1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观 ...

  9. bzoj2287:[POJ Challenge]消失之物

    思路:首先先背包预处理出f[x]表示所有物品背出体积为x的方案数.然后统计答案,利用dp. C[i][j]表示不用物品i,组成体积j的方案数. 转移公式:C[i][j]=f[j]-C[i][j-w[i ...

  10. File Operation using SHFileOperation

    SHFILEOPSTRUCT Original link: http://winapi.freetechsecrets.com/win32/WIN32SHFILEOPSTRUCT.htm Refere ...