题意:

给一棵树,树的每条边有一种颜色,黑色或白色,一开始所有边均为黑色,有两个操作:

操作1:将第i条边变成白色或将第i条边变成黑色。

操作2 :询问u,v两点之间仅经过黑色变的最短距离。

树链剖分+树状数组

学习树链剖分:

/*
树链剖分:
划分轻重链,效果是将一颗树变成了若干段连续的区间。
向上记录边权
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std; const int MAX = ;
//子树结点数,所在链链头,同链儿子,结点深度,节点在区间的位置,父节点
int siz[MAX], top[MAX], son[MAX], dep[MAX], w[MAX], fa[MAX];
//链式前向星记录一颗树
struct Edge {
int v, ne, id;
} edge[MAX << ]; int head[MAX], cnt, num;
int vis[MAX], pos[MAX];;
//第一次dfs,提取基本信息,划分轻重链
void Dfs1 (int u, int v) {
fa[v] = u, dep[v] = dep[u] + ;
siz[v] = ;
vis[v] = ;
int tem = , p = -;
for (int i = head[v]; i != ; i = edge[i].ne) {
int kid = edge[i].v;
if (!vis[kid]) {
Dfs1 (v, kid);
siz[u] += siz[kid];
if (tem < siz[kid]) tem = siz[kid], p = kid;
}
}
son[v] = p;
}
//第二次DFS,将重链映射到区间
void Dfs2 (int h, int v) {
top[v] = h;
w[v] = ++num;
vis[v] = ;
if (son[v] != -) Dfs2 (h, son[v]);
for (int i = head[v]; i != ; i = edge[i].ne) {
int kid = edge[i].v;
if (son[v] != kid && !vis[kid])
Dfs2 (kid, kid);
pos[edge[i].id] = w[kid]; //边映射到下结点
}
} void addE (int u, int v, int num) {
edge[++cnt].v = v, edge[cnt].id = num;
edge[cnt].ne = head[u], head[u] = cnt;
} int A[MAX]; //pos为边的新编号
void add (int x, int k) {
for (; x <= num; x += x & -x) A[x] += k;
}
int getsum (int x) {
int s = ;
for (; x > ; x -= x & -x) s += A[x];
return s;
}
void modify (int x, int k) {
x = pos[x];
int sta = getsum (x) - getsum (x - );
if (sta == k) return;
else add (x, k - sta);
} void query (int u, int v) {
int s = , f1 = top[u], f2 = top[v], len = ;
while (f1 != f2) {
if (dep[f1] < dep[f2]) {
int y = w[v], x = w[f2];
if (f2 != v) {
if (s += getsum (y) - getsum (x) ) break;
v = f2;
len += y - x;
}
if (s += getsum (x) - getsum (x - ) ) break;
v = fa[v], f2 = top[v];
len++;
}
else {
int y = w[u], x = w[f1];
if (f1 != u) {
if (s += getsum (y) - getsum (x) ) break;
u = f1;
len += y - x;
}
if (s += getsum (x) - getsum (x - ) ) break;
u = fa[u], f1 = top[u];
len++;
}
}
int y = w[v], x = w[u];
s += getsum (max (y, x) ) - getsum (min (y, x) );
len += abs (y - x);
printf ("%d\n", s == ? len : -);
}
int n, u, v, m, t;
int main() {
scanf ("%d", &n);
for (int i = ; i < n; i++) {
scanf ("%d %d", &u, &v);
addE (u, v, i), addE (v, u, i);
}
Dfs1 (, );
memset (vis, , sizeof vis);
Dfs2 (, );
scanf ("%d", &m);
int k, l, r,tol=;
for (int i = ; i <= m; i++) {
scanf ("%d", &k);
if (k != ) {
scanf ("%d", &t);
modify (t, k == ? : );
}
if (k == ) {
scanf ("%d %d", &l, &r);
query (l, r);
} }
}

codeforces 165D.Beard Graph 解题报告的更多相关文章

  1. Codeforces Round 665 赛后解题报告(暂A-D)

    Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...

  2. Codeforces Round 662 赛后解题报告(A-E2)

    Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...

  3. Codeforces Round #277.5 解题报告

    又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...

  4. codeforces B. Simple Molecules 解题报告

    题目链接:http://codeforces.com/problemset/problem/344/B 题目意思:这句话是解题的关键: The number of bonds of an atom i ...

  5. 【LeetCode】323. Number of Connected Components in an Undirected Graph 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 并查集 日期 题目地址:https://leetcod ...

  6. 【LeetCode】133. Clone Graph 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...

  7. codeforces 591A. Wizards' Duel 解题报告

    题目链接:http://codeforces.com/problemset/problem/591/A 题目意思:其实看下面这幅图就知道题意了,就是Harry 和 He-Who-Must-Not-Be ...

  8. codeforces 582A. GCD Table 解题报告

    题目链接:http://codeforces.com/problemset/problem/582/A 网上很多题解,就不说了,直接贴代码= = 官方题解: http://codeforces.com ...

  9. codeforces 581C. Developing Skills 解题报告

    题目链接:http://codeforces.com/problemset/problem/581/C 题目意思:给出 n 个数:a1, a2, ..., an (0 ≤ ai ≤ 100).给出值 ...

随机推荐

  1. Research Papers

    NSE, $\bbu$ [Papers]NSE, $u$, Lorentz space [Sohr, JEE, 2001] [Papers]NSE, $u$, Lorentz space [Bjorl ...

  2. Hibernate(八)一对多单向关联映射

    上次的博文Hibernate从入门到精通(七)多对一单向关联映射我们主要讲解了一下多对一单向关联映射, 这次我们继续讲解一下一对多单向映射. 一对多单向关联映射 在讲解一对多单向关联之前,按 照我们的 ...

  3. NGU-学习笔记(1)-动态添加删除图集

    现在 正在做unity的方向 不得不说我选的是UI方向 Unity中很有名的就是NGUI插件了.今天做了个ngui的简单背包系统.非常简陋..初学着 自己mark下 (1)预览 主要就是个 simpl ...

  4. Supervisord管理

    原文地址:http://blog.csdn.net/fyh2003/article/details/6837970 学习笔记 Supervisord可以通过sudo easy_install supe ...

  5. poj 2479 Maximum sum (最大字段和的变形)

    题目链接:http://poj.org/problem?id=2479 #include<cstdio> #include<cstring> #include<iostr ...

  6. 前端开发者应当了解的 Web 缓存知识

    缓存优点 通常所说的Web缓存指的是可以自动保存常见http请求副本的http设备.对于前端开发者来说,浏览器充当了重要角色.除此外常见的还有各种各样的代理服务器也可以做缓存.当Web请求到达缓存时, ...

  7. Google网页搜索

    本博文的主要内容有 .Google网页搜索的介绍 .Google网页搜索的使用偏好设置 .Google网页搜索的普通搜索 .Google网页搜索的高级搜索 .Google高级搜索之一:布尔逻辑搜索   ...

  8. 【设计模式 - 8】之组合模式(Composite)

    1      模式简介 组合模式可以将对象以树形结构来表现"整体/部分"层次结构,让客户以一致的方式处理个别形象以及对象组合. 组合模式让我们能用树形方式创建对象的结构,树里面包含 ...

  9. 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)

    问题: 当file_get_content()函数的参数  url中是localhost时不能抓取,是127.0.0.1时可以抓取到静态html代码.实现页面静态化技术提高访问效率. test.php ...

  10. 习WebSocket一(WebSocket初识)[转]

    http://www.cnblogs.com/wgp13x/p/3812579.html Java EE 7 去年刚刚发布了JSR356规范,使得WebSocket的Java API得到了统一,Tom ...