大致题意: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 树链剖分的更多相关文章

  1. hdu5044 Tree 树链拆分,点细分,刚,非递归版本

    hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...

  2. Hdu 5274 Dylans loves tree (树链剖分模板)

    Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...

  3. POJ3237 Tree 树链剖分 边权

    POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...

  4. Query on a tree——树链剖分整理

    树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...

  5. 【BZOJ-4353】Play with tree 树链剖分

    4353: Play with tree Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 31  Solved: 19[Submit][Status][ ...

  6. SPOJ Query on a tree 树链剖分 水题

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  7. poj 3237 Tree 树链剖分

    题目链接:http://poj.org/problem?id=3237 You are given a tree with N nodes. The tree’s nodes are numbered ...

  8. Codeforces Round #200 (Div. 1) D Water Tree 树链剖分 or dfs序

    Water Tree 给出一棵树,有三种操作: 1 x:把以x为子树的节点全部置为1 2 x:把x以及他的所有祖先全部置为0 3 x:询问节点x的值 分析: 昨晚看完题,马上想到直接树链剖分,在记录时 ...

  9. poj 3237 Tree 树链剖分+线段树

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  10. 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 ...

随机推荐

  1. Java继承与清理

    [程序实例] import java.util.*; class Characteristic { private String s; Characteristic(String s) { this. ...

  2. 创建第一个freemarker

    1.创建java项目TestFreeMarker 2.导入包freemarker.jar,添加依赖 3.在根目录下创建一个文件夹templates 4.在文件夹templates下创建文件a.ftl ...

  3. 字符流;字节流;带缓冲的输入输出流;以及用scanner读文件

    概念: InputStream类是字节输入流的抽象类,是所有字节输入流的父类. OutputStream类是字节输入流的抽象类,是所有字节输出流的父类. In(可以理解为读)Out(可以理解为写) 一 ...

  4. (转)UIWebView与JavaScript的那些事儿

    UIWebView是IOS SDK中渲染网面的控件,在显示网页的时候,我们可以hack网页然后显示想显示的内容.其中就要用到javascript的知识,而UIWebView与javascript交互的 ...

  5. Lesson2.1:LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue对比分析

    写这篇文章源于我经历过的一次生产事故,在某家公司的时候,有个服务会收集业务系统的日志,此服务的开发人员在给业务系统的sdk中就因为使用了LinkedList,又没有做并发控制,就造成了此服务经常不能正 ...

  6. 【实验 1-1】编写一个简单的 TCP 服务器和 TCP 客户端程序。程序均为控制台程序窗口。

    在新建的 C++源文件中编写如下代码. 1.TCP 服务器端#include<winsock2.h> //包含头文件#include<stdio.h>#include<w ...

  7. java.lang.OutOfMemoryError: Java heap space错误及处理办法(收集整理、转)

    下面是从网上找到的关于堆空间溢出的错误解决的方法: java.lang.OutOfMemoryError: Java heap space ============================== ...

  8. c++如何使用SOCKET 发送HTTP1.1 GET POST请求包

    如何使用SOCKET 发送HTTP1.1 GET POST请求包 分类: 无线通信 C/C++2009-10-29 10:58 14259人阅读 评论(15) 收藏 举报 socket服务器actio ...

  9. Java基础知识强化39:StringBuffer类之StringBuffer的删除功能

    1. StringBuffer的删除功能: public StringBuffer  deleteCharAt(int index):删除指定位置的字符,并返回字符串缓冲区本身. public Str ...

  10. (三)一个工作任务引起的乱战——udp通信

    先上代码.该代码是在问度娘的过程中搜到的,自己实验运行了下,可以使用(vs2010  net fram4.0).服务端代码: using System;using System.Collections ...