树链剖分后要处理的是边的权值,而不是点的权值,但是只要边权下放到点,就可以了

如图

但是问题是,求图4->5路径的权值之和, 那么就会把点3给算进去

那么就要减去,

或者干脆不加进去

有两种方法

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
const int INF = <<;
/*
12 1
1 2 1
2 3 1
3 4 1
4 5 1
5 11 1
11 12 1
1 6 1
6 7 1
7 8 1
6 9 1
6 10 1
1 9 10
*/
const int N = + ;
vector<int> g[N];
int size[N], son[N], fa[N], depth[N], top[N], w[N], num, ra[N];
LL tree[N*];
int edge[N][];
int h[N];
void dfs(int u)
{
size[u] = ;
son[u] = ;
for (int i = ; i < g[u].size(); ++i)
{
int v = g[u][i];
if (v != fa[u])
{
fa[v] = u;
depth[v] = depth[u] + ;
dfs(v);
size[u] += size[v];
if (size[v] > size[son[u]])
son[u] = v;
}
}
} void dfs2(int u, int tp)
{
w[u] = ++num;
ra[num] = u;
top[u] = tp;
if (son[u] != )
dfs2(son[u], top[u]);
for (int i = ; i < g[u].size(); ++i)
{
int v = g[u][i];
if (v != fa[u] && v != son[u])
dfs2(v, v);
} }
void pushUp(int rt)
{
tree[rt] = tree[rt << ] + tree[rt << | ];
}
void update(int l, int r, int rt, int pos, int val)
{
if (l == r)
{
tree[rt] = val;
return;
}
int mid = (l + r) >> ;
if (pos <= mid)
update(l, mid, rt << , pos, val);
else
update(mid + , r, rt << | , pos, val);
pushUp(rt);
} LL ans;
void query(int l, int r, int rt, int L, int R)
{
if (L <= l&&R >= r)
{
ans += tree[rt];
return;
}
int mid = (l + r) >> ;
if (L <= mid)
query(l, mid, rt << , L, R);
if (R > mid)
query(mid + , r, rt << | , L, R);
}
int main()
{
int n, m, a, b, c;
while (scanf("%d%d", &n, &m) != EOF)
{
memset(tree, , sizeof(tree));
for (int i = ; i <= n; ++i)
g[i].clear();
num = ;
for (int i = ; i < n; ++i)
{
scanf("%d%d%d", &edge[i][], &edge[i][], &edge[i][]);
g[edge[i][]].push_back(edge[i][]);
g[edge[i][]].push_back(edge[i][]);
}
fa[] = depth[] = ;
dfs();
dfs2(, );
for (int i = ; i < n; ++i)
{
if (depth[edge[i][]] > depth[edge[i][]])
swap(edge[i][], edge[i][]);
h[edge[i][]] = edge[i][];
update(, n, , w[edge[i][]], edge[i][]);
}
while (m--)
{
scanf("%d%d%d", &a, &b, &c);
if (a == )
{
if (depth[edge[b][]] > depth[edge[b][]])
swap(edge[b][], edge[b][]);
update(, n, , w[edge[b][]], c);
h[edge[b][]] = c;
}
else
{
ans = ;
while (top[b] != top[c])
{
if (depth[top[b]] < depth[top[c]])
swap(b, c);
query(, n, , w[top[b]], w[b]);
b = fa[top[b]];
}
//b和c一定是在一条链上
if (depth[b]>depth[c])
swap(b, c); //如果b有父亲,那么就有边下放到它,多加了这个点,要减去
query(, n, , w[b], w[c]);
if (fa[b] != )
ans -= h[b];
/*
如果b,c是在一条重链上, 那么询问w[son[b]] 到w[c]
那么就没有加到点b
否则,b,c就是指向同一点,那么w[son[b]] > w[c] , 询问是不会增加任何值的
query(1, n, 1, w[son[b]], w[c]);
*/
printf("%lld\n", ans);
}
}
}
return ;
}

FZU2082的更多相关文章

  1. FZU2082树链剖分

    简单题. #include<queue> #include<stack> #include<cmath> #include<cstdio> #inclu ...

随机推荐

  1. 《转》OpenStack Live Migration

    This post is based assumption that KVM as hypervisor, and Openstack is running in Grizzly on top of ...

  2. OCA读书笔记(6) - 配置Oracle网络环境

    6.Configuring the Oracle Network Environment su - grid装grid时自动创建了监听netca--创建新的监听 vi $ORACLE_HOME/net ...

  3. IE缓存的BUG 和其他浏览器的缓存问题

    原文:IE缓存的BUG 和其他浏览器的缓存问题 1 .IE浏览器在异步请求的时候 为了偷懒  第二次请求的时候不会给后台请求相应,这样我们就无法从后台拿值,  这样的话 ,我们可以画个妆,蒙骗IE我们 ...

  4. oracle 在操作blob该字段是否会产生很多redo

    操作blob该字段是否会产生很多redo,答案是否定的.以下来做一个实验,測试数据库版本号是11.2.0.1.0: --创建一张表做測试之用 create table test_blob (   id ...

  5. 程序缩小到托盘后系统就无法关机(解决方案)——处理WM_QUERYENDSESSION消息,并把它标识为处理过了

    程序缩小到托盘后系统就无法关机(解决方案)                       老帅    程序最小化到托盘后,会出现系统无法关闭的问题,常见于WinXP系统中,这里提供一个解决方案!一.解决 ...

  6. 取CPU序列号,获取网卡,取硬盘系列号,获取目录下的文件,强制删除目录

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  7. 斯坦福ML公开课笔记15—隐含语义索引、神秘值分解、独立成分分析

    斯坦福ML公开课笔记15 我们在上一篇笔记中讲到了PCA(主成分分析). PCA是一种直接的降维方法.通过求解特征值与特征向量,并选取特征值较大的一些特征向量来达到降维的效果. 本文继续PCA的话题, ...

  8. 公布一个软件,轻新视频录播程序,H264/AAC录制视音频,保存FLV,支持RTMP直播

    已经上传到CSDN,下载地址:http://download.csdn.net/detail/avsuper/7421647,不要钱滴,嘿嘿... 本程序能够把摄像头视频和麦克风音频,录制为FLV文件 ...

  9. uva 1434 - YAPTCHA(数论)

    题目链接:uva 1434 - YAPTCHA 题目大意:给定n和k,求题目中给定的式子S(n). 解题思路:威尔逊定理,x为素数时有,((x−1)!+1)%x==0,所以对于本题.假设3*k+7为素 ...

  10. 百度富文本编辑器UEditor1.3上传图片附件等

    今天一直在整我的一个项目的编辑器上传图片,我用的是百度UEditor 1.3版本号的:如今已经有了1.4的了,只是还算比較新吧,可是官网上面没有上传图片这些的教程,而网上对于这方面的资料非常少啊,折腾 ...