【贪心+数量剖分LCA】UOJ150-运输计划

【题目大意】

题目大意:给定一棵包含n个结点的树,树上的边权表示运输的时间。给定m条运输计划,这些运输计划同时开始执行。现在可以把任意一条边的权值变成0,问使得这m条运输全部结束的最短时间是多少? n, m <= 300,000

【思路】

m条运输全部结束的时间取决于最长的那条路径的长度 选择变成0的那条边(u, v),一定在最长路径上,所以枚举最长路径上的每一条边 所有包含(u, v)这条边的路径,长度都要减去w(u, v),因此不会超过最长路径减去w(u, v) 需要在所有不包含(u, v)的路径里,选择一条最长的路径

发现题目中有部分数据,这棵树是一条单链。 对于最长链上的边(i, i + 1),需要知道 所有终点在i (inclusive) 之前的链中最长的 所有起点在i + 1 (inclusive) 之后的链中最长的

如果不是一条链怎么办?

(u2, v2) ? (u2’, v2’),路径长度不变 将所有其他路径和最长路径求交

求一棵树上两条链(u1, v1), (u2, v2)的交 求出所有6个点对的LCA(最近公共祖先),并找出深度最大的两个LCA,记为LCA1, LCA2 如果LCA1 == LCA(u1, v1) 或者LCA1 == LCA(u2, v2),则这两条路径没有交。否则这两条链的交就是(LCA2, LCA2)

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 const int MAXN=300000+50;
  7 struct edge
  8 {
  9     int to,next,val;
 10 }e[MAXN<<1];
 11 int h[MAXN],tp;
 12 void ae(int u,int v,int w)
 13 {
 14     e[++tp].to=v;e[tp].next=h[u];e[tp].val=w;h[u]=tp;
 15 }
 16 int n,m;
 17 bool vis[N];
 18 int que[N],sum[N];
 19 int fa[N],siz[N],son[N],top[N],dep[N];
 20 struct Que
 21 {
 22     int u,v,w,lca;
 23     bool operator <(const Que &a)const{
 24         return w>a.w;
 25     }
 26 }q[N];
 27 void bfs(int u)
 28 {
 29     int f,t;
 30     vis[u]=1;
 31     que[f=t=1]=1;
 32     while(f<=t)
 33     {
 34         int u=que[f++];siz[u]=1;
 35         for(int v,i=h[u];i;i=e[i].next)
 36         if(!vis[v=e[i].to])
 37         {
 38             dep[v]=dep[u]+1;sum[v]=sum[u]+e[i].val;
 39             fa[v]=u;vis[v]=1;que[++t]=v;
 40         }
 41     }
 42     for(int i=n;i;i--)
 43     {
 44         siz[fa[que[i]]]+=siz[que[i]];
 45         if(siz[que[i]]>siz[son[fa[que[i]]]]) son[fa[que[i]]]=que[i];
 46     }
 47 }
 48 void dfs2(int u,int f,int t)
 49 {
 50     top[u]=t;
 51     if(son[u]) dfs2(son[u],u,t);
 52     for(int i=h[u];i;i=e[i].next)
 53     if(e[i].to!=f&&e[i].to!=son[u]) dfs2(e[i].to,u,e[i].to);
 54 }
 55 int get_lca(int x,int y)
 56 {
 57     while(top[x]!=top[y])
 58     {
 59         if(dep[top[x]]<dep[top[y]]) swap(x,y);
 60         x=fa[top[x]];
 61     }
 62     return dep[x]<dep[y]?x:y;
 63 }
 64 int tot[N],num;
 65 void work(int x,int y){tot[x]+=y;}
 66 bool check(int x)
 67 {
 68     num=0;
 69     memset(tot,0,sizeof(tot));
 70     for(int i=1;i<=m&&q[i].w>x;i++)
 71     {
 72         num++;
 73         work(q[i].u,1);work(q[i].v,1);
 74         work(q[i].lca,-2);
 75     }
 76     int mx=0;
 77     for(int i=n;i;i--)
 78     {
 79         if(tot[que[i]]==num) mx=max(mx,sum[que[i]]-sum[fa[que[i]]]);
 80         tot[fa[que[i]]]+=tot[que[i]];
 81     }
 82     return q[1].w-mx<=x;
 83 }
 84 #define LEN 1<<16
 85 char getc()
 86 {
 87     char *S,*T,buf[LEN];
 88     if(S==T)
 89     {
 90         T=(S=buf)+fread(buf,1,LEN,stdin);
 91         if(S==T)
 92             return EOF;
 93     }
 94     return *S++;
 95 }
 96 int read()
 97 {
 98     static char ch;
 99     static int D;
100     while(!isdigit(ch=getc()));
101     for(D=ch-‘0‘;isdigit(ch=getc());)
102         D=D*10+ch-‘0‘;
103     return D;
104 }
105 int main()
106 {
107     cin>>n>>m;
108     for(int u,v,w,i=1;i<n;i++)
109     {
110         u=read();v=read();w=read();
111         ae(u,v,w);ae(v,u,w);
112     }
113     bfs(1);
114     dfs2(1,0,1);
115     for(int i=1;i<=m;i++)
116     {
117         q[i].u=read();q[i].v=read();
118         q[i].lca=get_lca(q[i].u,q[i].v);
119         q[i].w=sum[q[i].u]+sum[q[i].v]-2*sum[q[i].lca];
120     }
121     sort(q+1,q+m+1);
122     int l=0,r=n*1000,mid,ans=0;
123     while(l<=r)
124     {
125         mid=(l+r)>>1;
126         if(check(mid)) ans=mid,r=mid-1;
127         else l=mid+1;
128     }
129     printf("%d\n",ans);
130 }
时间: 2024-08-22 19:57:46

【贪心+数量剖分LCA】UOJ150-运输计划的相关文章

UOJ150 运输计划

运输计划(transport.cpp/c/pas)[问题描述]公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n-1 条 双向 航道,每条航道建立在两个星球之间,这 n-1 条航道 连通 了 L 国的所有星球.小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 u i 号星球沿 最快 的宇航路径飞行到 v i 号星球去.显然,飞船驶过一条航道是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 t j ,并且任意两艘飞船之间 不会 产

运输计划(题解)(Noip2015)

运输计划(题解)(Noip2015) 二分答案+树上差分 树上差分其实不难,只是名字高大尚,可以学一下:Eternal风度的树上差分 本人博客里也总结了一些其他的知识供大家学习:Eternal风度的博客 具体解答 至于这是怎么想到的,一步一步来: 1.n有300000,不可能暴力枚举每一条边 2.因为我们要使运输时间的最大值最小,所以,考虑二分答案(做多了之后的习惯(其实也就是突然的灵感,不是必然......)) 3.既然二分了答案,暂且把我们二分的答案变量名叫 lim ,考虑On的check(

[noip 2015]运输计划 [LCA][树链剖分]

用了luogu上的题目描述 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物 流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去.显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰. 为了鼓励科技创

Vijos[1983]NOIP2015Day2T3 运输计划 transport LCA

题目链接Vijos 题目链接UOJ 转载一个大佬的题解: 点击这里->银牌爷题解 主要考察二分查找.树上倍增.贪心."树上前缀和".题目是一颗树,要求将一条边的权值变为0,使得所有运输计划的最大时间最小.直觉告诉我们,这是一个树上倍增的题目,但是它却不像前几年的 Day2T3 开车旅行那样纯倍增,或许更像疫情控制一些,倍增只是辅助算法,还需要配合其他算法.由于要使所有运输计划的最大时间最小,不难想到二分答案的方法.使C(t)表示是否可以改造一条边,使得改造之后所有运输计划中最长的

BZOJ 4326:NOIP2015 运输计划(二分+差分+lca)

NOIP2015 运输计划Description公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去.显然,飞船驶过一条航道是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之间不会产生任何干扰.为了鼓励科技创新, L

NOIP2015 运输计划(二分+LCA+差分)

4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 208[Submit][Status][Discuss] Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui

【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分

4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 703  Solved: 461[Submit][Status][Discuss] Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui

[NOIP2015]运输计划 D2 T3 LCA+二分答案+差分数组

[NOIP2015]运输计划 D2 T3 Description 公元2044年,人类进入了宇宙纪元. L国有n个星球,还有n-1条双向航道,每条航道建立在两个星球之间,这n-1条航道连通了L国的所有星球. 小P掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从ui号星球沿最快的宇航路径飞行到vi号星球去.显然,飞船驶过一条航道是需要时间的,对于航道j,任意飞船驶过它所花费的时间为tj,并且任意两艘飞船之间不会产生任何干扰. 为了鼓励科技创新,L国国王同意小P的物流

数据结构(树链剖分):COGS 2109. [NOIP2015] 运输计划

2109. [NOIP2015] 运输计划 ★★★   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物 流飞船需要从 ui 号星球沿最快的宇航路径飞行到 v