poj 2763 Housewife Wind
分析:这道题是树链剖分的裸题,把边的信息保存在深度大的那个节点上就行了。
一开始写的邻接表,居然TLE了。后来百度发现有人说前向星跑得比较快?我不是很明白,但是改成前向星以后的确快了很多,邻接表是T,而前向星只需要2s左右。
这个代码还是邻接表,因为我不信,又修改了一下邻接表上几个我觉得会增加常数的地方,交上去还是T了- -代码里前向星的部分被注释掉了。
/*****************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <map>
#include <set>
#include <ctime>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define offcin ios::sync_with_stdio(false)
#define sigma_size 26
#define lson l,m,v<<1
#define rson m+1,r,v<<1|1
#define slch v<<1
#define srch v<<1|1
#define sgetmid int m = (l+r)>>1
#define LL long long
#define ull unsigned long long
#define mem(x,v) memset(x,v,sizeof(x))
#define lowbit(x) (x&-x)
#define bits(a) __builtin_popcount(a)
#define mk make_pair
#define pb push_back
#define fi first
#define se second
const int INF = 0x3f3f3f3f;
const LL INFF = 1e18;
const double pi = acos(-1.0);
const double inf = 1e18;
const double eps = 1e-9;
const LL mod = 1e9+7;
const int maxmat = 10;
const ull BASE = 31;
/*****************************************************/
const int maxn = 1e5 + 5;
int siz[maxn], top[maxn], son[maxn], dep[maxn], fat[maxn], tid[maxn], rid[maxn];
int seg[maxn << 2], a[maxn];
int uu[maxn], vv[maxn], ww[maxn], tim;
int N, Q, S;
std::vector<int> G[maxn];
// struct Edge {
// int to, next;
// }edge[maxn << 1];
// int head[maxn], tot;
// void addedge(int u, int v) {
// edge[tot] = (Edge){v, head[u]};
// head[u] = tot ++;
// }
void dfs1(int u, int fa, int d) {
siz[u] = 1;
fat[u] = fa;
dep[u] = d;
int sz = G[u].size();
for (int i = 0; i < sz; i ++) {
int v = G[u][i];
if (v == fa) continue;
dfs1(v, u, d + 1);
siz[u] += siz[v];
if (son[u] == -1 || siz[v] > siz[son[u]]) son[u] = v;
}
}
void dfs2(int u, int tp) {
tid[u] = ++ tim;
top[u] = tp;
if (son[u] != -1) dfs2(son[u], tp);
int sz = G[u].size();
for (int i = 0; i < sz; i ++) {
int v = G[u][i];
if (v == son[u] || v == fat[u]) continue;
dfs2(v, v);
}
}
void PushUp(int v) {
seg[v] = seg[slch] + seg[srch];
}
void build(int l, int r, int v) {
if (l == r)
seg[v] = a[l];
else {
sgetmid;
build(lson);
build(rson);
PushUp(v);
}
}
void update(int p, int val, int l, int r, int v) {
if (l == r) {
seg[v] = val;
}
else {
sgetmid;
if (p <= m) update(p, val, lson);
else update(p, val, rson);
PushUp(v);
}
}
int query(int L, int R, int l, int r, int v) {
if (L <= l && r <= R) return seg[v];
int ans = 0;
sgetmid;
if (L <= m) ans += query(L, R, lson);
if (R > m) ans += query(L, R, rson);
return ans;
}
int getv(int u, int v) {
int tp1 = top[u], tp2 = top[v];
int ans = 0;
while (tp1 != tp2) {
if (dep[tp1] < dep[tp2]) {
swap(tp1, tp2);
swap(u, v);
}
ans += query(tid[tp1], tid[u], 1, N, 1);
u = fat[tp1];
tp1 = top[u];
}
if (u == v) return ans;
if (dep[u] > dep[v]) swap(u, v);
ans += query(tid[son[u]], tid[v], 1, N, 1);
return ans;
}
int main(int argc, char const *argv[]) {
while (~scanf("%d%d%d", &N, &Q, &S)) {
mem(son, -1);
tim = 0;
for (int i = 1; i < N; i ++) {
scanf("%d%d%d", &uu[i], &vv[i], &ww[i]);
G[uu[i]].pb(vv[i]);
G[vv[i]].pb(uu[i]);
}
dfs1(1, -1, 1);
dfs2(1, 1);
for (int i = 1; i < N; i ++) {
if (dep[uu[i]] > dep[vv[i]]) swap(uu[i], vv[i]);
a[tid[vv[i]]] = ww[i];
}
build(1, N, 1);
for (int i = 0; i < Q; i ++) {
int op, x, y;
scanf("%d", &op);
if (op) {
scanf("%d%d", &x, &y);
update(tid[vv[x]], y, 1, N, 1);
}
else {
scanf("%d", &x);
int ans = getv(S, x);
printf("%d\n", ans);
S = x;
}
}
}
return 0;
}
poj 2763 Housewife Wind的更多相关文章
- POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )
POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...
- POJ 2763 Housewife Wind LCA转RMQ+时间戳+线段树成段更新
题目来源:POJ 2763 Housewife Wind 题意:给你一棵树 2种操作0 x 求当前点到x的最短路 然后当前的位置为x; 1 i x 将第i条边的权值置为x 思路:树上两点u, v距离为 ...
- poj 2763 Housewife Wind(树链拆分)
id=2763" target="_blank" style="">题目链接:poj 2763 Housewife Wind 题目大意:给定一棵 ...
- POJ 2763 Housewife Wind(DFS序+LCA+树状数组)
Housewife Wind Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 11419 Accepted: 3140 D ...
- POJ 2763 Housewife Wind(树链剖分)(线段树单点修改)
Housewife Wind Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 10378 Accepted: 2886 D ...
- POJ 2763 Housewife Wind (树链剖分 有修改单边权)
题目链接:http://poj.org/problem?id=2763 n个节点的树上知道了每条边权,然后有两种操作:0操作是输出 当前节点到 x节点的最短距离,并移动到 x 节点位置:1操作是第i条 ...
- poj 2763 Housewife Wind (树链剖分)
题目链接:http://poj.org/problem?id=2763 题意: 给定一棵含n个结点的树和树的边权,共有q次操作,分为两种 0 c :求从位置s到c的距离,然后s变成c 1 a b:把第 ...
- POJ 2763 Housewife Wind 纯粹LCA写法(简单无脑)
Description After their royal wedding, Jiajia and Wind hid away in XX Village, to enjoy their ordina ...
- poj 2763 Housewife Wind : 树链剖分维护边 O(nlogn)建树 O((logn)²)修改与查询
/** problem: http://poj.org/problem?id=2763 **/ #include<stdio.h> #include<stdlib.h> #in ...
- POJ 2763 Housewife Wind(树链剖分+树状数组)
[题目链接] http://poj.org/problem?id=2763 [题目大意] 在一棵树上,给出一些边的边长,有修改边的边长的操作, 询问每次从当前点到目标点的最短距离 [题解] 树链剖分之 ...
随机推荐
- 《30天自制操作系统》18_day_学习笔记
harib15a: 到这里为止,我们已经能实现窗口的切换了.我们发现所有的窗口都有光标闪烁,而我们只希望可以接受输入的窗口有光标闪烁.这里我们先来修改任务A中的光标闪烁,当按下TAB时,如果让A不现实 ...
- PHP js使用ajax异步处理方式请求PHP,解决数组中文乱码
html端: <html> <head> <script type="text/javascript" src="jquery/jquery ...
- 循环编辑文件夹IBMEmptorisSSM-WSDL 下面的所有的wsdl文件到 d盘的wsdlSource下
@echo off cd C:\Program Files\Java\jdk1.6.0_45\binfor /R "D:\wqcCode\company\emtproj\02 Require ...
- go log repl
package main import ( "fmt" "os/exec" "regexp" "strconv" &qu ...
- 【转】PowerShell入门(二):PowerShell是Cmd命令行的加强版吗?
转至:http://www.cnblogs.com/ceachy/archive/2013/01/31/PowerShell_vs_Cmd.html PowerShell是命令行的加强版吗?Power ...
- LINQ to SQL:Where、Select/Distinct
Where 操作 适用场景:实现过滤,查询等功能. 简单说明:与 SQL 命令中的 Where 作用相似,都是起到范围限定也就是过滤作用的 ,而判断条件就是它后面所接的子句. Where 操作包括 3 ...
- SqlCommandBuilder的讨论
之前也看过别人的解释,总感觉解释的不太理想,当然我自己的解释我尽量解释理想点,SqlCommandBuilder 是提供给外界对数据库的反操作的,如果只是对数据库的一个提取的话,那么用下面的代码足以 ...
- 图论$\cdot$最短路问题
Dijkstra单源最短路径算法 Dijkstra可以计算出发点到每个点的最短路,及单源最短路径(SSSP).这一特点使得Dijkstra常常用来进行其他算法的预处理.用Dijkstra算法计算最短路 ...
- SourceTree 免登录跳过初始设置
SourceTree 安装之后需要使用账号登陆以授权,以前是可以不登陆的,但是现在是强制登陆. 虽然是免费授权,但是碰上不可抗力因素,登陆不是很方便,这里记录一下跳过这个初始化的步骤. 安装之后,转到 ...
- 系统巡警 v1.2 系统行为分析神器
系统巡警,是一款安全辅助软件,可以帮助系统维护人员或安全研究人员观察系统运行情况,包括进程启动与销毁记录.模块加载记录.线程启动与销毁记录.系统服务创建修改和删除记录.文件与文件夹的增加删除和修改记录 ...