zoukankan      html  css  js  c++  java
  • hdu 3078 Network lca

    题目链接

    给一棵树, m个操作, 一共两种操作, 将第x个点的权值改为y, 询问x->y路径上权值第k大的点的权值。

    暴力的找.....

      1 #include <iostream>
      2 #include <vector>
      3 #include <cstdio>
      4 #include <cstring>
      5 #include <algorithm>
      6 #include <cmath>
      7 #include <map>
      8 #include <set>
      9 #include <string>
     10 #include <queue>
     11 #include <stack>
     12 #include <bitset>
     13 using namespace std;
     14 #define pb(x) push_back(x)
     15 #define ll long long
     16 #define mk(x, y) make_pair(x, y)
     17 #define lson l, m, rt<<1
     18 #define mem(a) memset(a, 0, sizeof(a))
     19 #define rson m+1, r, rt<<1|1
     20 #define mem1(a) memset(a, -1, sizeof(a))
     21 #define mem2(a) memset(a, 0x3f, sizeof(a))
     22 #define rep(i, n, a) for(int i = a; i<n; i++)
     23 #define fi first
     24 #define se second
     25 typedef pair<int, int> pll;
     26 const double PI = acos(-1.0);
     27 const double eps = 1e-8;
     28 const int mod = 1e9+7;
     29 const int inf = 1061109567;
     30 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
     31 const int maxn = 1e5+5;
     32 int head[maxn*2], num, f[maxn], deep[maxn], n, val[maxn];
     33 struct node
     34 {
     35     int to, nextt;
     36 }e[maxn*2];
     37 void add(int u, int v) {
     38     e[num].to = v, e[num].nextt = head[u], head[u] = num++;
     39 }
     40 void init() {
     41     num = 0;
     42     mem1(head);
     43 }
     44 void dfs(int u, int fa) {
     45     f[u] = fa;
     46     for(int i = head[u]; ~i; i = e[i].nextt) {
     47         int v = e[i].to;
     48         if(v == fa)
     49             continue;
     50         deep[v] = deep[u]+1;
     51         dfs(v, u);
     52     }
     53 }
     54 int lca(int k, int a, int b)
     55 {
     56     int i,j;
     57     vector <int> v;
     58     if(deep[a]<deep[b])
     59         swap(a, b);
     60     while(deep[a]>deep[b]) {
     61         v.pb(val[a]);
     62         a = f[a];
     63     }
     64     while(a!=b) {
     65         v.pb(val[a]);
     66         v.pb(val[b]);
     67         a = f[a];
     68         b = f[b];
     69     }
     70     v.pb(val[a]);
     71     if(k>v.size())
     72         return -1;
     73     sort(v.begin(), v.end());
     74     reverse(v.begin(), v.end());
     75     return v[k-1];
     76 }
     77 int main()
     78 {
     79     int x, y, m, w, z, sign;
     80     while(cin>>n>>m) {
     81         init();
     82         for(int i = 1; i<=n; i++)
     83             scanf("%d", &val[i]);
     84         for(int i = 0; i<n-1; i++) {
     85             scanf("%d%d", &x, &y);
     86             add(x, y);
     87             add(y, x);
     88         }
     89         dfs(1, 0);
     90         while(m--) {
     91             scanf("%d%d%d", &sign, &x, &y);
     92             if(!sign) {
     93                 val[x] = y;
     94             } else {
     95                 int ans = lca(sign, x, y);
     96                 if(~ans)
     97                     cout<<ans<<endl;
     98                 else
     99                     puts("invalid request!");
    100             }
    101         }
    102     }
    103     return 0;
    104 }
  • 相关阅读:
    20款时尚的 WordPress 博客主题【免费下载】
    垂涎欲滴!30个美味的食品类移动应用程序【上篇】
    Skippr – 轻量、快速的 jQuery 幻灯片插件
    Boba.js – 用于 Google 统计分析 JavaScript 库
    长期这么做的后果就是人民劳苦而得不到该有的回报,怎么能不垮
    左值与右值的根本区别在于能否获取内存地址,而能否赋值不是区分的依据
    百度后端C++电话一面
    Web 开发和数据科学家仍是 Python 开发的两大主力
    Consul架构
    去除两端逗号-JS
  • 原文地址:https://www.cnblogs.com/yohaha/p/5094717.html
Copyright © 2011-2022 走看看