Network

【题目链接】Network

【题目类型】LCA dfs

&题意:

给出n个点的权值,m条边,2种操作

0 u num,将第u个点的权值改成num

k u v,询问u到v这条路上第k大的权值点

&题解:

首先可以确定的是这是一颗树,求的又是路径,所以我们可以试着用lca辅助一下(有人说为什么不用最短路,当然可以用最短路,但是时间复杂度很高,还有树上u到v点只有1条路,所以不必用最短路)

所以可以先求一下输入的u和v的lca,之后我们可以把经过的所有点找出来,之后排个序就好了,怎么找所有点呢?我们可以在dfs时用一个pre数组记录每个点的父亲是谁,这样,输入给了低下的点,又知道了lca,只要求u到lca的边,和v到lca的边就好了.

最后放到数组里一排序就ac了

求lca那块也可以用tarjan+并查集 这里用的是dfs的,其实都一样啦,因为都是只要求出u和v的lca的序号就可以了

&代码:

#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define fo(i,a,b) for(int i=(a);i<=(b);i++)
#define fd(i,a,b) for(int i=(a);i>=(b);i--)
#define cle(a,v) memset(a,(v),sizeof(a))
const int maxn = 80000 + 7;
int n, q, val[maxn], He[maxn], id, fid[maxn], order[maxn * 2], depth[maxn * 2], rq[maxn * 2][20], mm[maxn * 2], pre[maxn];
struct Edge {
int to, nx;
} ed[maxn * 2]; void Ori() {
id = 0;
cle(He, -1);
} void eAdd(int u, int v) {
ed[id].to = v, ed[id].nx = He[u];
He[u] = id++;
} void dfs(int v, int p, int d, int& k) {
pre[v] = p;
fid[v] = k;
order[k] = v;
depth[k++] = d;
for(int j = He[v]; ~j; j = ed[j].nx) {
if(ed[j].to != p) {
dfs(ed[j].to, v, d + 1, k);
order[k] = v;
depth[k++] = d;
}
}
} void rmqInit(int n, int b[]) {
mm[0] = -1;
for(int i = 1; i <= n; i++) {
mm[i] = (i & (i - 1)) ? mm[i - 1] : mm[i - 1] + 1;
rq[i][0] = i;
}
for(int j = 1; j <= mm[n]; j++)
for(int i = 1; i + (1 << j) - 1 <= n; i++) {
int x = rq[i][j - 1], y = rq[i + (1 << (j - 1))][j - 1];
rq[i][j] = b[x] < b[y] ? x : y;
}
} int RMQ(int x, int y, int b[]) {
if(x > y) swap(x, y);
int k = mm[y - x + 1];
int x2 = rq[x][k], y2 = rq[y - (1 << k) + 1][k];
return b[x2] < b[y2] ? x2 : y2;
} int LCA(int u, int v) {
return order[RMQ(fid[u], fid[v], depth)];
} int vi[maxn], cvi;
void path(int x, int top) {
while(x != top) {
vi[cvi++] = val[x];
x = pre[x];
}
} int main() {
freopen("E:1.in", "r", stdin);
scanf("%d%d", &n, &q);
Ori();
int u, v, op;
fo(i, 1, n) scanf("%d", &val[i]);
fo(i, 2, n) {
scanf("%d%d", &u, &v);
eAdd(u, v);
eAdd(v, u);
}
int k = 1;
dfs(1, 1, 0, k);
rmqInit(k - 1, depth);
fo(o, 1, q) {
scanf("%d%d%d", &op, &u, &v);
if(op == 0) {
val[u] = v;
}
else {
int lc = LCA(u, v);
cvi = 0;
// printf("%d\n", lc);
path(u, lc);
path(v, lc);
vi[cvi++] = val[lc];
sort(vi, vi + cvi);
if(op > cvi) {
printf("invalid request!\n");
}
else {
// for(int i = 0; i < cvi; i++) {
// printf("%d ", vi[i]);
// } printf("\n");
printf("%d\n", vi[cvi - op]);
}
}
}
return 0;
}

HDU 3078 Network(LCA dfs)的更多相关文章

  1. HDU 3078 Network LCA

    题意:n个点 m个询问,下面一行是n 个点的权值 再下面n-1行是双向的边 然后m个询问:k u v 若k==0,则把u点的权值改为v,否则回答u->v之间最短路经过点的权值中  第k大的值是多 ...

  2. hdu 3078 Network (暴力)+【LCA】

    <题目链接> 题目大意:给定一颗带点权的树,进行两种操作,k=0,更改某一点的点权,k!=0,输出a~b路径之间权值第k大的点的点权. 解题分析:先通过RMQ的初始化,预处理pre[]数组 ...

  3. HDU - 3078 Network(暴力+LCA)

    题目大意:给出n个点的权值.m条边,2种操作 0 u num,将第u个点的权值改成num k u v,询问u到v这条路上第k大的权值点 解题思路:该点的话直接该,找第k大的话直接暴力 #include ...

  4. HDU 3078 Network

    简单的  RMQ:  先预处理得到  所有 节点的 公共祖先  和  dfs 得到所有节点的父亲节点:  然后  询问时,从自己出发向上找父亲, 然后  得到所有的节点:排序一下 不知道  这题这样也 ...

  5. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  6. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  7. 【BZOJ】2819: Nim(树链剖分 / lca+dfs序+树状数组)

    题目 传送门:QWQ 分析 先敲了个树链剖分,发现无法AC(其实是自己弱,懒得debug.手写栈) 然后去学了学正解 核心挺好理解的,$ query(a) $是$ a $到根的异或和. 答案就是$ l ...

  8. HDOJ(HDU).2660 Accepted Necklace (DFS)

    HDOJ(HDU).2660 Accepted Necklace (DFS) 点我挑战题目 题意分析 给出一些石头,这些石头都有自身的价值和重量.现在要求从这些石头中选K个石头,求出重量不超过W的这些 ...

  9. HDOJ(HDU).1045 Fire Net (DFS)

    HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...

随机推荐

  1. comake2

    http://blog.csdn.net/lsjseu/article/details/23395565 comake允许用户通过编写COMAKE文件,来帮助用户管理编译依赖以及编译环境的开发工具: ...

  2. maven项目打包额外lib目录

    maven项目依赖了几个额外的jar包一直都无法打进最终jar,不知道哪里出了问题.一直对这块不甚清楚,就大概梳理一下 默认打包方式: maven项目下,默认编译目录为 src/main/java和s ...

  3. mac os系统go安装:go install github.com/nsf/gocode: open /usr/local/go/bin/gocode: permission denied

    gocode是go语言代码自动提示工具 安装时进入src目录执行:go get -u github.com/nsf/gocode 出现: github.com/nsf/gocode (download ...

  4. 3.贝叶斯网络表示(The Bayesian Network Representation)

    对于一个n随机变量的联合分布,一般需要2**n-1个参数来表示这个分布.但是,我们可以通过随机变量之间的独立性,减少参数的个数. naive Beyes model: Bayesian Network ...

  5. JAVA中有一个特殊的类: Object。它是JAVA体系中所有类的父类(直接父类或者间接父类)。

    接口往往被我们定义成一类XX的东西. 接口实际上是定义一个规范.标准.   ①  通过接口可以实现不同层次.不同体系对象的共同属性: 通过接口实现write once as anywhere. 以JA ...

  6. VS2013-2017 舒服的字体设置和背景色

    使用字体:Fixedsys Excelsior 3.01 1.如果没有安装字体的话,首先下载字体:http://www.fixedsysexcelsior.com/ 2.安装字体:控制面板 -> ...

  7. IDEA破解教程

    IDEA目前堪称最完美的java开发工具,相信用惯了eclipse的朋友一定不这么认为,但是这并不是终点,终点是如何安装破解版的IDEA,官网给我们的两个下载:1.免费试用:2.免费.开源.作为一名程 ...

  8. Serv-u 备份处理

    需求分析 从删库到跑路,大家听过很多,但如果没删备份的话,那只能说玩的不够彻底,不专业.系统管理员一个非常重要的职责就是定期备份,以便在系统出现故障的时候能够及时恢复.我们来看下如何备份Serv-u系 ...

  9. J Press the Button

    BaoBao and DreamGrid are playing a game using a strange button. This button is attached to an LED li ...

  10. 用memset设置无穷大无穷小

    memeset是以字节为单位进行赋值的,对字符数组可以直接用. 但对于int数组就不行了. 但设置无穷大来说有个技巧: 如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f ...