首页 > 其他分享 >P2680 NOIP2015 提高组 运输计划

P2680 NOIP2015 提高组 运输计划

时间:2023-04-19 13:45:04浏览次数:58  
标签:运输 NOIP2015 ch int 路径 P2680 dep maxn ls

P2680 NOIP2015 提高组 运输计划

最小化最长的路径,考虑二分答案。

问题转化成检验删去一条边的边权后,最长路径权值能否不超过 \(x\)。

考虑没删边权时,原先那些不超过 \(x\) 的路径,删去边权后肯定不会影响,直接忽略。

考虑原先比 \(x\) 长的那些路径。我们期望删边权后这些路径全部变短到 \(x\) 以内,因此称之为关键路径。

很明显,我们必须找一条被所有关键路径经过的边。否则,至少有一条关键路径的权值不会缩减,修改是无效的。

然后又很明显,我们直接贪心地找被所有关键路径经过的,权值最大的边,删除权值是最优的。

树上差分做到 \(\Theta((n + m)\log \sum t)\)。

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2023-04-19 12:55:53 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2023-04-19 13:33:47
 */
#include <bits/stdc++.h>
inline int read() {
    int x = 0;
    bool f = true;
    char ch = getchar();
    for (; !isdigit(ch); ch = getchar())
        if (ch == '-')
            f = false;
    for (; isdigit(ch); ch = getchar())
        x = (x << 1) + (x << 3) + ch - '0';
    return f ? x : (~(x - 1));
}
inline bool gmx(int &a, int b) {
    return b > a ? a = b, true : false;
}

const int maxn = 300005;
const int maxm = 300005;
const int mlgn = 20;

int n, m;

typedef std :: pair <int, int> pii;
std :: vector <pii> G[maxn];

int lg[maxn], fa[maxn], prew[maxn], dep[maxn], dfn[maxn], dis[maxn], mi[mlgn][maxn], times = 0;

inline int depmin(int u, int v) {
    return dep[u] < dep[v] ? u : v;
}

void dfs(int u, int ls) {
    dfn[u] = ++times;
    dep[u] = dep[ls] + 1;
    fa[u] = mi[0][dfn[u]] = ls;
    for (pii e : G[u]) {
        int v = e.first, w = e.second;
        if (v == ls)
            continue;
        dis[v] = dis[u] + w;
        prew[v] = w;
        dfs(v, u);
    }
}

inline void getmi() {
    for (int j = 1; j <= lg[n]; ++j)
        for (int i = 1; i + (1 << j) - 1 <= n; ++i)
            mi[j][i] = depmin(mi[j - 1][i], mi[j - 1][i + (1 << (j - 1))]);
}

inline int lca(int u, int v) {
    if (u == v)
        return u;
    u = dfn[u];
    v = dfn[v];
    if (u > v)
        std :: swap(u, v);
    int s = lg[v - u++];
    return depmin(mi[s][u], mi[s][v - (1 << s) + 1]);
}

struct query {
    int s, t, L;
} q[maxn];

int cnt[maxn];

void dfs2(int u) {
    for (pii e : G[u]) {
        int v = e.first;
        if (v == fa[u])
            continue;
        dfs2(v);
        cnt[u] += cnt[v];
    }
}

inline bool check(int x) {
    int tot = 0;
    std :: memset(cnt, 0, sizeof(cnt));
    for (int i = 1; i <= m; ++i) {
        int s = q[i].s, t = q[i].t, L = q[i].L, p = lca(s, t);
        if (L <= x) {
            tot = i - 1;
            break;
        }
        ++cnt[s];
        ++cnt[t];
        cnt[p] -= 2;
    }

    dfs2(1);

    int maxw = 0;
    for (int u = 1; u <= n; ++u) {
        if (cnt[u] == tot)
            gmx(maxw, prew[u]);
    }

    return q[1].L - maxw <= x;
}

int main() {
    n = read(); m = read();
    for (int i = 2; i <= n; ++i)
        lg[i] = lg[i >> 1] + 1;
    for (int i = 1; i < n; ++i) {
        int u = read(), v = read(), w = read();
        G[u].push_back({v, w});
        G[v].push_back({u, w});
    }
    dfs(1, 0);
    getmi();

    for (int i = 1; i <= m; ++i) {
        int s = q[i].s = read(), t = q[i].t = read(), p = lca(s, t);
        q[i].L = dis[s] + dis[t] - dis[p] * 2;
    }

    std :: sort(q + 1, q + 1 + m, [](query a, query b) {
        return a.L > b.L;
    });

    int ans = 0;
    if (check(0)) {
        puts("0");
        return 0;
    }
    
    for (int i = (1 << 30); i; i >>= 1)
        if (!check(ans + i))
            ans += i;
    printf("%d\n", ans + 1);
    return 0;
}

标签:运输,NOIP2015,ch,int,路径,P2680,dep,maxn,ls
From: https://www.cnblogs.com/crab-in-the-northeast/p/luogu-p2680.html

相关文章

  • 人工智能技术可有效提高交通运输效率和安全性
    随着城市化进程的加速,交通运输问题越来越成为人们关注的焦点。而人工智能技术的发展,为解决交通运输问题提供了新的思路和方法。本文将探讨人工智能技术在交通运输领域的应用,以及它对交通运输效率和安全性的提升。一、人工智能技术在交通运输领域的应用1.智能交通管理系统智能......
  • 【计算机网络】运输层知识点
    运输层运输层向它上面的应用层提供通信服务。真正通信的主体是主机中的一个进程和另一个主机的一个进程交换数据。网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。运输层向高层用户屏蔽了下面网络核心的细节,使应用进程看见的就好像在两个运输层实体......
  • 计算机网络----运输层
    《运输层概述》    解释:《端口》 具体书P214两台主机进行通信就是两台主机中的应用进程相互通信所谓的端到端的通信也就是应用进程之间的通信这个端就是所谓的端口   ......
  • 计算机网络实验 实验5 运输层和应用层协议解析
    实验5运输层和应用层协议解析一、实验目的  本实验通过运用Wireshark对网络活动进行分析,观察TCP协议报文,分析通信时序,理解TCP的工作过程,掌握TCP工作原理与实现;学会运用Wireshark分析TCP连接管理、流量控制和拥塞控制的过程,发现TCP的性能问题。二、实验内容任务1:TCP正常......
  • 苹果反间谍趣闻:曾把产品放在番茄箱子里运输
    虽然每次苹果推出新产品之前总是流言满天飞,但并不代表苹果在保密措施上不上心,相反地,苹果对于供应商方面泄露信息地担心已经到神经质的地步。甚至曾经用为未作特殊标记番茄箱子运送产品。当然,这不是另一个瞎扯的流言,这是由BusinessWeek的 PeterBurrows和AdamSatariano报道......
  • P4015 运输问题
    W公司有mm个仓库和nn个零售商店。第ii个仓库有aiai​个单位的货物;第jj个零售商店需要bjbj​个单位的货物。货物供需平衡,sum{ai}=sum{bi}从第i个仓库运送......
  • 【NOIP2015】【Luogu2615】神奇的幻方(模拟填数)
    problem给一定n*n的矩阵,要求填上1~n*n的数,使之每行、列、对角线的和都相等。n为奇数时,按如下步骤构建:1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右......
  • 洛谷 P1967 货车运输
    P1967NOIP2013提高组]货车运输-洛谷|计算机科学教育新生态(luogu.com.cn)这个题目算是lca的稍微拓展吧。主要思考方向应该是很明显的。就是考虑一条路径上权值最......
  • 秘密的牛奶运输
    /*求次小生成树的思路先把最小生成树建出来,再对这个树进行dfs,得到任意两点之间所经过的边中权值最大的边的权值dis[][]。依次枚举每条非树边,得到点a,b,权......
  • P2679 [NOIP2015 提高组] 子串
    两个仅包含小写英文字母的字符串AA和BB。现在要从字符串AA中取出kk个互不重叠的非空子串,然后把这kk个子串按照其在字符串AA中出现的顺序依次连接起来得到一个......