临近\(noip,AK\)不太现实,暴力才是王道,大佬无视

这里只介绍\(65\)分做法



\(m==1\) 的情况

很明显 就一条路径,当然要贪心选着一条路径路上的最大的边喽

傻逼分\(get 20\)分



\(n,m<=100\)

想怎么暴力怎么暴力,反正不会TLE

**枚举割哪一条边 **

枚举每条路径dfs()一边 寻找最大值

最后取min 就好了

复杂度\(O(n^3)\)

又get 10分

很明显的二分,我就是不会(⊙o⊙)



一条链子的时候并且n<=3000

求路径的和的时候可以用前缀和维护一下

达到O(1)的查询

使得②的复杂度降低了一个\(O(n)\)

最终复杂的\(O(n^2)\)

get 15分 啦



一条链子的时候并且n>=3000

二分他的最大长度

当然得利用③的O(1)查询啦

考虑check函数

如果第i次运货路线大于x(也就是二分的mid)

那么要割掉的点一定在\(l_{i}\)和\(r_{i}\)之间

维护一下左边界和右边界就好了(如果不成立的话直接return 0)

最后在左边界和右边界查询最大就好啦

最终复杂度O(\(nlogn\))

get 20分

最终得分 \(65\)

打死我也不会lca

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=100007;
int n,m;
int S[maxn],T[maxn],num[maxn];
int noip[maxn],cz[maxn];
struct edge{
int v,nxt,q;
}e[maxn<<1];
int head[maxn<<1],tot;
int a[maxn],sum[maxn];
int tot_30,max_30,flag_30;
void add_edge(int u,int v,int q)
{
e[++tot].v=v;
e[tot].q=q;
e[tot].nxt=head[u];
head[u]=tot;
}
inline int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9') {if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9') {x=x*10+s-'0',s=getchar();}
return x*f;
}
void dfs_30(int u,int f,int end)
{
if(u==end) {
flag_30=1;
return;
}
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(v==f) continue; int tmp=max_30;
tot_30+=e[i].q;
max_30=max(max_30,e[i].q); dfs_30(v,u,end);
if(flag_30) return; tot_30-=e[i].q;
max_30=tmp;
}
}
int check(int x)
{
int l=1,r=n;
int zz=0;
for(int i=1;i<=m;++i)
{
if(num[i] > x)
{
zz=max(zz,num[i]);
if(l >= T[i]) return 0;
if(r <= S[i]) return 0;
l=max(l,S[i]);
r=min(r,T[i]);
}
}
int tmp=0;
for(int i=l+1;i<=r;++i)
tmp=max(tmp,a[i]);
zz-=tmp;
return zz > x ? 0 : 1;
}
int main()
{
n=read(),m=read();
int flag_lz=0;
for(int i=1;i<n;++i)
{
int a=read(),b=read(),c=read();
if(a==b+1||b==a+1) flag_lz++;
add_edge(a,b,c);
add_edge(b,a,c);
}
for(int i=1;i<=m;++i)
S[i]=read(),T[i]=read();
if(m==1)
{
dfs_30(S[1],0,T[1]);
printf("%d\n",tot_30-max_30);
return 0;
}
if(n<=1000)
{
int ans=0x3f3f3f3f;
for(int i=1;i<=2*n-2;i+=2) // 枚举航道
{
int tmp=e[i].q;
e[i].q=e[i+1].q=0;
int dsr=0;
for(int j=1;j<=m;++j) //遍历客户
{
flag_30=tot_30=0;
dfs_30(S[j],0,T[j]);
dsr=max(dsr,tot_30);
}
ans=min(ans,dsr);
e[i].q=e[i+1].q=tmp;
}
printf("%d\n",ans);
return 0;
}
if(flag_lz==n-1)
{
for(int i=1,j=2;i<=2*(n-1);i+=2,j++)
a[j]=e[i].q;
for(int i=2;i<=n;++i)
sum[i]=sum[i-1]+a[i];
for(int i=1;i<=m;++i)
{
if(S[i]>T[i]) swap(S[i],T[i]);
num[i]=sum[T[i]]-sum[S[i]];
}
int l=1,r=3e8;
int ans;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}
return 0;
}

luogu P2680 运输计划 65分做法的更多相关文章

  1. Luogu P2680 运输计划(二分+树上差分)

    P2680 运输计划 题意 题目背景 公元\(2044\)年,人类进入了宇宙纪元. 题目描述 公元\(2044\)年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道 ...

  2. [luogu]P2680 运输计划[二分答案][树上差分]

    [luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...

  3. luogu P2680 运输计划 (二分答案+树上差分)

    题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...

  4. luogu P2680 运输计划

    传送门 要最长链的长度最短,一秒想到二分,因为如果对于某个长度满足改掉一边的边权后能使得所有链长度不超过该长度,则所有比他长的长度也满足. 二分最终答案.我们要使得原来长度大于二分的\(mid\)的链 ...

  5. 洛谷 P2680 运输计划 解题报告

    P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...

  6. 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)

    P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...

  7. P2680 运输计划(二分+树上差分)

    P2680 运输计划 链接 分析: 二分+树上差分. 首先可以二分一个答案,那么所有比这个答案大的路径,都需要减去些东西才可以满足这个答案. 那么减去的这条边一定在所有的路径的交集上. 那么如果求快速 ...

  8. 洛谷——P2680 运输计划

    https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...

  9. P2680 运输计划

    http://www.luogu.org/problem/show?pid=2680#sub 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航 ...

随机推荐

  1. 洛谷P3527 MET-Meteors [POI2011] 整体二分

    正解:整体二分 解题报告: 传送门! 还有个双倍经验!(明明是一样的题目为什么你们一个紫一个黑啊喂! 这题首先要想到可以二分嘛,然后看到多组询问肯定就整体二分鸭 那就是基本套路啊,发现是区间修改单点查 ...

  2. 看懂Oracle执行计划、表连接方式

    看懂Oracle执行计划  原文:https://www.cnblogs.com/Dreamer-1/p/6076440.html 最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也 ...

  3. HTML5-Canvas 绘制线条的深入认识

    1. lineWidth 线条宽度 ( 示例: lineWidth = 10 ) 2. lineCap 线条帽(线条两端的形状) ( 示例: lineCap = butt(default) | rou ...

  4. Integer.valueOf方法的源码解读

    public class IntegerDemo { public static void main(String[] args) { Integer i01 = ; ; Integer i03 = ...

  5. C#集合中的Add与AddRange方法

    C#.NET的集合主要位于System.Collections和System.Collections.Generic(泛型)这两个namespace中. 1.System.Collections 比如 ...

  6. Postman使用js获取日期

    在用postman进行接口自动化测试的时候,某个查询接口需要使用到日期参数进行请求: 假设当前日期为2018-05-07 10:30:20 ,需要传的日期为: beginTime:2018-05-01 ...

  7. Pycharm上python3运行unittest无法生成测试报告

    原文地址https://www.cnblogs.com/yoyoketang/p/7523409.html 前言 经常有人在群里反馈,明明代码一样的啊,为什么别人的能出报告,我的出不了报告:为什么别人 ...

  8. excel 数字转文本

    问: 在EXCEL2003中,如何把一列数字转换成文本格式我的意思的,这一列数字全部变成带有文本格式符号(就是左上角有个绿色小三角)的那种以文本形式存储的数字.目前我只知道一个一个双击单元格,但一列数 ...

  9. Sublime Text3(mac)一些插件和快捷键

    Sublime Text3(mac)一些插件和快捷键 楚简约 关注 2017.02.24 17:02* 字数 1216 阅读 412评论 0喜欢 2 下载地址http://www.sublimetex ...

  10. windows中xcopy命令详解

    一.格式: 二.举例说明: 1.复制文件,文件路径有空格的,那么就使用双引号括起来.如果目标路径已经有相同文件了,使用覆盖方式而不进行提示.在复制文件的同时也复制空目录或子目录      xcopy  ...