题意:一棵树上两种操作,操作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. 用jsp方式通知客户端下载文件

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  2. scala学习笔记:理解并行集合par

    scala> (1 to 5).foreach(println(_)) 1 2 3 4 5 scala> (1 to 5).par.foreach(println(_)) 3 1 4 2 ...

  3. 最新版spark1.1.0集群安装配置

    和分布式文件系统和NoSQL数据库相比而言,spark集群的安装配置还算是比较简单的: 很多教程提到要安装java和scala,但我发现spark最新版本是包含scala的,JRE采用linux内嵌的 ...

  4. 如何让Div层悬浮在Flash Object对象之上(转载)

    今天有个用户,门户右上角的倒三角登陆小按钮在他的电脑上无法显示,他用的笔记本屏幕较小,宽度正好显示出页面内容,经查看,门户页眉使用的为flash对象. 大家都知道,如果想让某个图片或者Div层悬浮在别 ...

  5. 设计模式------PROTOTYPE(原型),TEMPLATE(模板)

    看链接:http://blog.csdn.net/wuzhekai1985/article/details/6667020.纯属为自己学习所使用. 对于原型模式的理解:就如连接中所说,制作简历时先手写 ...

  6. 用PHP操作http中Etag、lastModified和Expires标签

    http://blog.hehehehehe.cn/a/10994.htm 客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request ...

  7. xp 中的IIS安装成功之后,访问网页显示没有权限访问解决方法

    在做xp的IIS发布网站时遇到一个问题就是当你访问网站的时候,显示没有权限访问网站,但是我已经开启了匿名访问网站了,怎么还没有权限访问呢?后来经过上网搜资料解决,当时很多网上都说没打开匿名访问,当时我 ...

  8. 【开发】Form 表单 Linkbutton 禁用

    在权限判定中,对于无权限操作的按钮可直接隐藏($.hide()). HTML 定义 <a id="btnPreAssign_GeneralTasks" class=" ...

  9. CSS FIXED porn javhd

    CSS position property - W3Schools W3Schools › cssref › pr_class_position Definition and Usage. The p ...

  10. Java JDK1.5、1.6、1.7新特性整理(转)

    原文链接:http://www.cnblogs.com/tony-yang-flutter/p/3503935.html 一.Java JDK1.5的新特性 1.泛型: List<String& ...