单个边的权值修改以及询问路径上的权值之和。

数据量比较大,用vector存图会超时的。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; void scan(int& x)
{
x = ;
int ch = ' ';
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= '') { x = x * + ch - ''; ch = getchar(); }
} int n, Q, s; const int maxn = + ;
int u[maxn], v[maxn], d[maxn]; struct Edge
{
int v, nxt;
}; int cnt;
int head[maxn];
Edge edge[maxn * ]; void AddEdge(int u, int v)
{
edge[cnt].v = v;
edge[cnt].nxt = head[u];
head[u] = cnt++;
} int tot;
int L[maxn];
int fa[maxn];
int sz[maxn];
int son[maxn];
int id[maxn];
int top[maxn]; void dfs(int u)
{
sz[u] = ; son[u] = ;
for(int i = head[u]; i != -; i = edge[i].nxt)
{
int v = edge[i].v;
if(v == fa[u]) continue;
fa[v] = u;
L[v] = L[u] + ;
dfs(v);
sz[u] += sz[v];
if(sz[v] > sz[son[u]]) son[u] = v;
}
} void dfs2(int u, int tp)
{
top[u] = tp;
if(son[u]) { id[son[u]] = ++tot; dfs2(son[u], tp); }
for(int i = head[u]; i != -; i = edge[i].nxt)
{
int v = edge[i].v;
if(v == fa[u] || v == son[u]) continue;
id[v] = ++tot;
dfs2(v, v);
}
} int sum[maxn << ]; void update(int o, int L, int R, int p, int v)
{
if(L == R) { sum[o] = v; return ; }
int M = (L + R) / ;
if(p <= M) update(o<<, L, M, p, v);
else update(o<<|, M+, R, p, v);
sum[o] = sum[o<<] + sum[o<<|];
} int query(int o, int L, int R, int qL, int qR)
{
if(qR < L || qL > R) return ;
if(qL <= L && R <= qR) return sum[o];
int ans = ;
int M = (L + R) / ;
ans += query(o<<, L, M, qL, qR);
ans += query(o<<|, M+, R, qL, qR);
return ans;
} int Query(int u, int v)
{
int ans = ;
int t1 = top[u], t2 = top[v];
while(t1 != t2)
{
if(L[t1] < L[t2]) { swap(u, v); swap(t1, t2); }
ans += query(, , tot, id[t1], id[u]);
u = fa[t1]; t1 = top[u];
}
if(u == v) return ans;
if(L[u] < L[v]) swap(u, v);
ans += query(, , tot, id[son[v]], id[u]);
return ans;
} int main()
{
while(scanf("%d%d%d", &n, &Q, &s) == )
{
memset(head, -, sizeof(head));
cnt = ;
for(int i = ; i < n; i++)
{
scan(u[i]); scan(v[i]); scan(d[i]);
AddEdge(u[i], v[i]);
AddEdge(v[i], u[i]);
} L[] = fa[] = ;
dfs();
tot = ;
dfs2(, ); memset(sum, , sizeof(sum));
for(int i = ; i < n; i++)
{
if(L[u[i]] < L[v[i]]) swap(u[i], v[i]);
update(, , tot, id[u[i]], d[i]);
} int op, x, y;
while(Q--)
{
scan(op);
if(op == )
{
scan(x);
printf("%d\n", Query(s, x));
s = x;
}
else
{
scan(x); scan(y);
update(, , tot, id[u[x]], y);
}
}
} return ;
}

代码君

POJ 2763 树链剖分 线段树 Housewife Wind的更多相关文章

  1. POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )

    POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...

  2. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  3. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  4. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  5. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  6. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  7. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

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

  9. 【POJ3237】Tree(树链剖分+线段树)

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

  10. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

随机推荐

  1. 基于JAVA的设计模式之组合模式

    概念 将所有对象组合成一种树形结构,有分支节点.叶子节点,分支节点可以有自己的子节点,子节点可以是分支节点.叶子节点,可以进行增删的操作,而叶子节点不可以.比如文件夹就是一个分支节点,而文件就是一个叶 ...

  2. Guice入门

    参考链接:http://www.cnblogs.com/xd502djj/archive/2012/06/25/2561414.html Google Guice范例解说之使用入门 http://co ...

  3. 前端js优化方案(二)持续更新

    由于上篇篇幅过长,导致编辑出了问题,另开一篇文章继续: (4)减少迭代次数,最广为人知的一种限制循环迭代次数的模式被称为“达夫设备(Duff`s Device)” Duff`s Device的理念是: ...

  4. JavaScript笔记6-数组新方法

    七.ECMAScript5关于数组的新方法 1.forEach():遍历数组,并为每个元素调用传入的函数;     举例:    var a = [1,2,3]; var sum = 0; //传一个 ...

  5. I Have a Dream(我有一个梦想)

    I Have a Dream by Martin Luther King, Jr. I am happy to join with you today in what will go down in ...

  6. npm相关命令

    npm install npm install log4js npm list npm list log4js #查看模板安装版本 npm install log4js@1.0.1 #指定模块版本安装 ...

  7. Linux Centos7.2 编译安装PHP7.0.2

    操作环境: 1.系统:Centos7.2 2.服务:Nginx 1.下载PHP7.0.2的安装包解压,编译,安装: $ cd /usr/src/ $ wget http://cn2.php.net/d ...

  8. 对比java和python对比

    对比java和python 对比java和python 2011年04月18日 1.难易度而言.python远远简单于java. 2.开发速度.Python远优于java 3.运行速度.java远优于 ...

  9. 使用com.sun.imageio.plugins.png.PNGMetadata读取图片的元数据

    所谓图片元数据,就是除了我们肉眼看到的图片内容外,隐藏在这些内容背后的一些技术数据. 本文介绍如何使用Java代码将一张图片的隐藏信息读取出来. 首先不需要下载任何额外的Java库,用JDK自带的库就 ...

  10. Problem C: 查找最大元素

    Problem C: 查找最大元素 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 786  Solved: 377[Submit][Status][Web ...