首页 > 其他分享 >运输计划

运输计划

时间:2024-03-08 18:12:07浏览次数:12  
标签:spx 运输 int max len fa 计划 tot

运输计划[做题笔记]

题意

概括:给定 \(n\) 个节点的树和 \(n-1\) 条边的权值,现在可以将一条边的权值改为 \(0\) 。找出一条边,使得将这条边权值赋为 \(0\) 时,\(T\) 组节点 \(u,v\) 之间的距离最大值最小,输出最小值。

思路分析

一开始想假了,天真的以为被 \(T\) 组节点 \(u,v\) 覆盖的次数最多,且权值较大的边就是要删去的边,\(38\)分,查题解才知道是二分答案。

不过确实,求最大值最小,的确是要二分的。先预处理出 \(T\) 组节点 \(u,v\) 的 \(LCA\) 和距离 \(len\) ,那么答案二分的区间就是 \([0,MAXLEN]\) 。

二分答案的精髓是什么?是check()函数
                            ----miaomiao

那么,对于当前 \(check\) 的 \(x\),有:

  • \(first\),要使 \(x\) 合法,那么删去这条边后,所有路径长 \(<= x\)
  • \(second\),要找出这条边,首先要枚举所有的 \(len\) ,记录比\(x\)大的个数 \(sum\) ,并将这些边在树上差分。如果有一条边被上述边同时覆盖,显然这就是我们要赋\(0\)的最优边(当然可能存在多条,显然要取边权最大的 \(max\_ len\))
  • \(third\),用 \(MAXLEN-max\_ len\),如果结果\(<=x\),显然合法(最长边都满足,底下那些小弟就更不用说了)

弱弱地提醒句,求LCA要用tarjan,倍增过不了……(狂D不止)

\(AC \ code\)

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define N 300010
#define int long long
int n,m;int ans;
struct EDGE{
    int next,to,t;
}e[N<<1],d[N<<1];
int spx[N];
int he[N],tot;
int hd[N];
int edge[N];
int MAXLEN;
struct SOLVE{
    int u,v,lca,len;
}q[N];

inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')  f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')    x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return f*x;
}
void write(int x)
{
    if(x<0)  putchar('-'),x=-x;
    if(x>9)    write(x/10);
    putchar(x%10+'0');
    return;
}

void add(int u,int v,int t)
{
    tot++;
    e[tot].to=v;
    e[tot].next=he[u];
    he[u]=tot;
    e[tot].t=t;
    return ;
}
void add_d(int u,int v)
{
    tot++;
    d[tot].to=v;
    d[tot].next=hd[u];
    hd[u]=tot;
    return;
}
int fa[N];
int dis[N];

int find(int x)
{
    if(x==fa[x])  return x;
    return fa[x]=find(fa[x]);
}
bool f[N];
void tarjan(int x,int pre)
{
    int y;
    for(int i=he[x];i>0;i=e[i].next)
    {
        y=e[i].to;
        if(y!=pre)
        {
            edge[y]=i;
            dis[y]=dis[x]+e[i].t;
            tarjan(y,x);
            int fa_x=find(x);
            int fa_y=find(y);
            if(fa_x!=fa_y)
                fa[fa_y]=fa_x;
            f[y]=1;
        }
    }
    for(int i=hd[x];i>0;i=d[i].next)
    {
        y=d[i].to;
        if(f[y]){
            int now=(i+1)>>1;
            q[now].lca=find(y);
            q[now].len=dis[x]+dis[y]-2*dis[q[now].lca];
            MAXLEN=max(MAXLEN,q[now].len);
        }
    }
}
int sum,max_len;
void dfs_spx(int x,int pre)
{
    int y;
    for(int i=he[x];i>0;i=e[i].next)
    {
        y=e[i].to;
        if(y!=pre)
        {
            dfs_spx(y,x);
            spx[x]+=spx[y];
        }
    }
    if(spx[x]==sum)
        max_len=max(max_len,e[edge[x]].t);
}
bool judge(int x)
{
    for(int i=0;i<=n;i++)  spx[i]=0;
    sum=0;max_len=0;
    for(int i=1;i<=m;i++)
    {
        if(q[i].len>x)
        {
            sum++;
            spx[q[i].u]++;
            spx[q[i].v]++;
            spx[q[i].lca]-=2;
        }
    }
    dfs_spx(1,0);
    if(MAXLEN-max_len<=x)
        return 1;
    return 0;
}

signed main()
{
    #ifndef ONLINE_JUDGE
        freopen("lty.in","r",stdin);
        freopen("lty.out","w",stdout);
    #endif
    n=read();m=read();
    for(int i=1;i<n;++i)
    {
        int a,b,c;
        a=read(),b=read(),c=read();
        add(a,b,c);add(b,a,c);
    }
    tot=0;
    for(int i=1;i<=n;++i)    fa[i]=i;
    for(int i=1;i<=m;++i)
    {
        int u,v;
        u=read(),v=read();
        q[i].u=u;q[i].v=v;
        add_d(u,v);
        add_d(v,u);
    }
    tarjan(1,0);
    int st=0,ed=MAXLEN;
    while(st<ed)
    {
        int mid=(st+ed)>>1;
        if(judge(mid))    ed=ans=mid;
        else    st=mid+1;
    }
    write(ans);
    return 0;
}

标签:spx,运输,int,max,len,fa,计划,tot
From: https://www.cnblogs.com/lty-ylzsx/p/18061578

相关文章

  • macOS的任务计划crontab
    使用crontab执行计划任务看了看多老大的讲解和视频仍然无法正常运行,在这里整理了一下crontab的用法和坑首先crontab是需要预先创建。第一步打开终端,执行sudotouch/etc/crontab如果不创建我们所编辑的crontab命令会保存到/tmp目录中,不知道什么时候就会消失,很多人问题出在这......
  • 2024年度计算机技术与软件专业技术资格(水平)考试工作计划
     首页政策法规考试介绍考试安排考试用书考试研究与对外交流各地联系方式2024年03月08日 丨回到首页 当前位置:首页>考试安排2024年度计算机技术与软件专业技术资格(水平)考试工作计划2024-03-05 来源:中国计算机技术职业资格网声明:本网(www.rua......
  • 2024年“ENVI/SARscape遥感应用培训班(7城市)”启动计划
    传递遥感技术助力遥感应用2024年“ENVI/SARscape遥感应用培训班(7城市)”启动计划 每一站会提前通知,详细信息及报名方式请关注:微信公众号:ENVI技术殿堂(右侧二维码)博客:https://envi.geoscene.cn/blog邮箱:envi-idl@geoscene.cn热线:400-819-2281转4......
  • 安防视频监控云平台EasyCVR v3.5支持批量设置录像计划时间段
    安防视频监控云平台EasyCVR支持多协议接入、可分发多格式的视频流,平台支持高清视频的接入、管理、共享,支持7*24小时不间断监控。视频监控管理平台EasyCVR可提供实时远程视频监控、录像、回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰......
  • 奥特曼净资产破20亿美元;苹果计划通过线上渠道发布 2024 款 iPad 和 Mac丨 RTE 开发者
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • 【2024-02-26】购车计划
    20:00我们不只是今天的,或者昨天的,我们是广阔的时间所塑造的。                                                 ——荣格周末我们一家人去特斯拉4S店看了车,这是我第一......
  • 健身计划
    不要垃圾容量,热身一定充分,护腕无时无刻,无论什么动作,一定要戴上;每周至少一次的有氧,晚上别熬夜,要开心二月一二三四五六日春节胸+肱三背+肱二腿肩+腹+有氧胸+肱三公司聚餐背+肱二腿+肩腹胸+肱三旅游旅游三月一二......
  • 运输层
    一、运输层1、TCP和UDP简介2.TCP和UDP对比A、无连接和面向连接B、对单播、多播、广播的支持情况UDP都支持,TCP只支持单播C、UDP和TCP对应用层报文的处理UDP:既不合并也不拆分,保留报文的边界,也就是说UDP是面向报文的。TCP:可能合并和拆分,面向字节流的。D、UDP和TCP首部对比......
  • 计划清单
    接下来的一个月的时间内准备一天完成6道题具有针对性的完成 五道题大致为下: 1. 一道CF1400~17002.  一道背包dp(背包完成后会针对性的进行其他的动态规划) 3. 一道图论(单源,多源最短路,最小生成树,差分约束,树的重心,求最长路......
  • 洛谷P2762 太空飞行计划问题 笔记
    传送门神奇的题目。正解就是源点向实验连边,边权为收益。然后仪器向汇点连边,边权为代价。然后答案就是所有实验收益之和-最小割。考虑证明。首先所有实验收益之和显然对应了做所有的实验。然后考虑割掉一条边。如果割掉的是源点->实验,那么就是不做这个实验。如果割了仪器->汇......