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

数据量比较大,用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. vue or react mvvm里的文字上下滚动

    1.jQuery 时候实现 上下滚动很简单,基本上一个animateTop就可以了 2. vue等MVVM就有些麻烦了,因为不推荐操作DOM,专注于数据 我们可以使用 css3 transition: ...

  2. AJPFX关于ArrayList集合容器的操作

    1.创建     ArrayList<Egg> myList=new ArrayList<Egg>(); //<Egg>代表创建出Egg类型的List,新的Arra ...

  3. DatabaseMetaData类

    DatabaseMetaData类是java.sql包中的类,利用它可以获取我们连接到的数据库的结构.存储等很多信息.如: 1.数据库与用户,数据库标识符以及函数与存储过程.         2.数据 ...

  4. 整合mybatis分页插件及通用接口测试出现问题

    严重: Servlet.service() for servlet [springmvc] in context with path [/mavenprj] threw exception [Requ ...

  5. Kendo UI 单页面应用(四) Layout

    Kendo UI 单页面应用(四) Layout Layout 继承自 View,可以用来包含其它的 View 或是 Layout.下面例子使用 Layout 来显示一个 View <div i ...

  6. ssh免密登录配置方法

    方法一 1.#ssh-keygen -t rsa 在客户端生成密钥对 把公钥拷贝给要登录的目标主机, 目标主机上将这个公钥加入到授权列表 #cat id_rsa.pub >> author ...

  7. 11g 新特性 Member Kill Escalation 简介

    首先我们介绍一下历史.在oracle 9i/10g 中,如果一个数据库实例需要驱逐(evict, alert 文件中会出现ora-29740错误)另一个实例时,需要通过LMON进程在控制文件(以下简称 ...

  8. CF Gym 100187B A Lot of Joy (古典概型)

    题意:给两个一样的只含有26个小写字母的字符串,然后两个分别做一下排列,问如果对应位置的字母相等那么就愉悦值就加一,问愉悦值的期望是多少? 题解:只考虑两个序列相对的位置,那么就相当于固定一个位置,另 ...

  9. python_80_模块定义导入优化实例

            运行结果 __import__作用: 同import语句同样的功能,但__import__是一个函数,并且只接收字符串作为参数,所以它的作用就可想而知了.其实import语句就是调用这 ...

  10. C++内存溢出和内存泄漏?

    1.内存溢出 内存溢出是指程序在申请内存时没有足够的内存空间供其使用.原因可能如下: (1)内存中加载的数据过于庞大: (2)代码中存在死循环: (3)递归调用太深,导致堆栈溢出等: (4)内存泄漏最 ...