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

数据量比较大,用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. vconsole移动端调试技巧(禁止webviuew,inspect等)

    如果由于某种原因(天朝FQ),不能支持google 的 inspect  调试 或者再想在某个APP里面调试你的页面,但是没有打开APP的webview ,也不能授权调试 在或者,Fider 可以拦截 ...

  2. plsql连接远程数据库快捷方式

    不用修改任何文件就可以直接连接远程数据库

  3. linq动态分页排序

    if (!string.IsNullOrEmpty(order) && !string.IsNullOrEmpty(dir))//判断排序的字段名称和排序的类型是否为空 { if (d ...

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

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

  5. ABAP事件分类

    1.报表事件 INITIALIZATION. START-OF-SELECTION. END-OF-SELECTION. 2.选择屏幕事件 在INITIALIZATION和START-OF-SELEC ...

  6. Yii2 的快速配置 api 服务 yii2-fast-api

    yii2-fast-api yii2-fast-api是一个Yii2框架的扩展,用于配置完善Yii2,以实现api的快速开发. 此扩展默认的场景是APP的后端接口开发,因此偏向于实用主义,并未完全采用 ...

  7. 多段图动态规划dp

    多段图问题是DP的基础题目.大体的意思是有一个赋权有向图,其顶点集被分为几个子集.求经过每个子集从源点到终点的最短路径 import java.util.ArrayList; import java. ...

  8. 为什么要用mallloc

    为什么要用malloc函数申请内存空间? 有的程序往往在运行时才知道要动态分配多大的内存,例如: void foo(char *str, int n) { char buf[?]; strncpy(b ...

  9. 使用ABAP批量下载有道云笔记中的图片

    Jerry喜欢用有道云笔记这款软件做自己的知识管理和知识体系的构建. 当您看到一篇好的有道云笔记分享时,可能会想将其精美的图片下载到本地.作为程序猿,我们不会去手动一张张下载.写个程序帮我们自动下载吧 ...

  10. Python面向对象(三)

    类的使用:实例化.属性引用 实例化 g1 = Garen('草丛伦1') # 实例化 g2 = Garen('草丛伦2') g3 = Garen('草丛伦3') 类的属性:变量和函数 print(Ga ...