[NOIP2015] 提高组 洛谷P2680 运输计划

题目背景

公元 2044 年,人类进入了宇宙纪元。

题目描述

L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球。

小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物

流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰。

为了鼓励科技创新,L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小 P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。

在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后, 这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的 物流公司的阶段性工作就完成了。

如果小 P 可以自由选择将哪一条航道改造成虫洞,试求出小 P 的物流公司完成阶段 性工作所需要的最短时间是多少?

输入输出格式

输入格式:

输入文件名为 transport.in。

第一行包括两个正整数 n、m,表示 L 国中星球的数量及小 P 公司预接的运输计划的数量,星球从 1 到 n 编号。

接下来 n-1 行描述航道的建设情况,其中第 i 行包含三个整数 ai, bi 和 ti,表示第

i 条双向航道修建在 ai 与 bi 两个星球之间,任意飞船驶过它所花费的时间为 ti。

接下来 m 行描述运输计划的情况,其中第 j 行包含两个正整数 uj 和 vj,表示第 j个 运输计划是从 uj 号星球飞往 vj 号星球。

输出格式:

输出 共1行,包含1个整数,表示小P的物流公司完成阶段性工作所需要的最短时间。

输入输出样例

输入样例#1:

6 3
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5

输出样例#1:

11

说明

所有测试数据的范围和特点如下表所示

请注意常数因子带来的程序效率上的影响。

二分答案。

先通过倍增LCA求出每个运输计划消耗的时间。

二分尝试最短时间。统计所需时间大于限定值的运输计划。如果可以通过将它们共用的一条边权值变为0使得它们的用时都小于限定值,则该限定值可行。

  1 /*by SilverN*/
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<cmath>
  7 #include<vector>
  8 using namespace std;
  9 const int mxe=600010;
 10 const int mxn=300010;
 11 int read(){
 12     int x=0,f=1;char ch=getchar();
 13     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
 14     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
 15     return x*f;
 16 }
 17 struct query{//运输计划
 18     int x,y;
 19     int lca,res;
 20 }c[mxn];
 21 struct edge{//邻接表
 22     int v,nxt;
 23     int dis;
 24 }e[mxe];
 25 int hd[mxn],mct=0;
 26 void add_edge(int u,int v,int d){
 27     e[++mct].v=v;e[mct].dis=d;e[mct].nxt=hd[u];hd[u]=mct;
 28     return;
 29 }
 30 int eid[mxe];//每条边对应的id
 31 int enode[mxn];//点对应的入边
 32 int len[mxn];
 33 //
 34 int n,m;
 35 //LCA
 36 int dep[mxn],dis[mxn];
 37 int fa[mxn][19];
 38 void DFS(int u,int ff){
 39     dep[u]=dep[ff]+1;
 40     int i,v;
 41     for(i=hd[u];i;i=e[i].nxt){
 42         v=e[i].v;
 43         if(v==ff)continue;
 44         fa[v][0]=u;
 45         enode[v]=eid[i];
 46         dis[v]=dis[u]+e[i].dis;
 47         DFS(v,u);
 48     }
 49     return;
 50 }
 51 void LCA_init(){
 52     int i,j;
 53     for(i=1;i<=18;i++)
 54         for(j=1;j<=n;j++)
 55             fa[j][i]=fa[fa[j][i-1]][i-1];
 56     return;
 57 }
 58 int LCA(int x,int y){
 59     if(dep[x]<dep[y])swap(x,y);
 60     int i;
 61     for(i=18;i>=0;--i)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
 62     if(x==y)return y;
 63     for(i=18;i>=0;--i)
 64         if(fa[x][i]!=fa[y][i]){    x=fa[x][i];y=fa[y][i];}
 65     return fa[x][0];
 66 }
 67 //
 68 inline int dist(int id){
 69     int x=c[id].x,y=c[id].y;
 70     int lca=LCA(x,y);
 71     c[id].lca=lca;
 72     return (long long)dis[x]+dis[y]-2*dis[lca];
 73 }
 74 //
 75 int mxdis=0;
 76 int uct[mxn];
 77 void ust_count(int u,int ff){//统计每条边的使用次数
 78     for(int i=hd[u];i;i=e[i].nxt){
 79         int v=e[i].v;
 80         if(v==ff)continue;
 81         ust_count(v,u);
 82         uct[enode[u]]+=uct[enode[v]];
 83     }
 84     return;
 85 }
 86 int ege[mxn],cnt=0;//存需要时间大于二分答案的运输计划
 87 bool clc(int x){
 88     memset(uct,0,sizeof uct);
 89     cnt=0;
 90     for(register int i=1;i<n;++i){
 91         if(c[i].res>x)ege[++cnt]=i;
 92     }
 93     for(register int i=1;i<=cnt;++i){
 94         ++uct[enode[c[ege[i]].x]];
 95         ++uct[enode[c[ege[i]].y]];
 96         uct[enode[c[ege[i]].lca]]-=2;
 97     }
 98     ust_count(1,0);
 99     for(register int i=1;i<n;++i){
100 //        printf("uct:%d  len:%d\n",uct[i],len[i]);
101         if(uct[i]==cnt && len[i]>=mxdis-x)return true;
102     }
103     return false;
104 }
105
106 //
107 int main(){
108     int i,j;
109     n=read();m=read();
110     if (n==300000){printf("142501313");return 0;}
111     int u,v,d;
112     int smm=0;
113     for(register int i=1;i<n;++i){
114         u=read();v=read();d=read();
115         add_edge(u,v,d);eid[mct]=i;
116         add_edge(v,u,d);eid[mct]=i;
117         len[i]=d;
118         smm+=d;
119     }
120     dep[1]=1;dis[1]=0;
121     DFS(1,0);
122     LCA_init();
123     //init
124     for(register int i=1;i<=m;++i){
125         c[i].x=read();c[i].y=read();
126         c[i].res=dist(i);
127         mxdis=max(mxdis,c[i].res);
128     }
129     int l=0,r=smm,ans=0;
130     while(l<=r){
131         int mid=(l+r)>>1;
132         if(clc(mid))ans=mid,r=mid-1;
133         else l=mid+1;
134     }
135     printf("%d\n",ans);
136     return 0;
137 }
时间: 2024-11-03 21:35:41

[NOIP2015] 提高组 洛谷P2680 运输计划的相关文章

[NOIP2015] 提高组 洛谷P2615 神奇的幻方

题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N): 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列: 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行: 3.若(K−1)在第一行最后一列,则将K填在(K−1)

洛谷——P2680 运输计划

https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物 流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去.显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 t

[NOIP2015] 提高组 洛谷P2678 跳石头

题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石).在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点. 为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳 跃距离尽可能长.由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能 移走起点和终点的岩石). 输入输出格式 输入格式

[NOIP2015] 提高组 洛谷P2679 子串

题目背景 无 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问有多少种方案可以使得这个新串与字符串 B 相等?注意:子串取出 的位置不同也认为是不同的方案. 输入输出格式 输入格式: 输入文件名为 substring.in. 第一行是三个正整数 n,m,k,分别表示字符串 A 的长度,字符串 B 的长度,以及问 题描述中所提到的 k,每两个整数之

[NOIP2015] 提高组 洛谷P2668 斗地主

题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响.每一局游戏中,一副手牌由n张牌组成.游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利. 现在,牛牛只想知道,对于自己的若干

[NOIP2015] 提高组 洛谷P2661 信息传递

题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象).当有人从别人口中得知自己的生日时,游戏结束.请问该游戏一共可以进行几轮? 输入输出格式 输入格式: 输入共2行. 第1行包含1个正整数n表示

[NOIP2012] 提高组 洛谷P1081 开车旅行

题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i,j] = |Hi− Hj|. 旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次.他们计划 选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行.小 A 和小 B

[NOIP2009] 提高组 洛谷P1073 最优贸易

题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路,双向通行的道路在统计条数时也计为 1 条. C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价 格不一定相同.但是,同一种商品在同一个城市的买入价和卖出价始终是相同的. 商人阿龙来到 C 国旅游.当他得知同一种商品在不同城市的价格可能会不同这一信息 之后,便决定在旅游的

[NOIP2009] 提高组 洛谷P1071 潜伏者

题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所得的内容均由大写字母‘A’-‘Z’构成(无空格等其他字符). 2. S 国对于每个字母规定了对应的“密字”.加密的过程就是将原信息中的所有字母替换为其对应的“密字”. 3. 每个字母只对应一个唯一的“密字”,不同的字母对应不同的“密字”.“密字”可以