P2680 運輸計劃

傳送門

十分顯然完成工作的時間和航耗時最長的運輸計劃有關

所以題目意思就是要求最大值最小

所以可以想到二分

把所有大于mid時間的航線打上標記,顯然刪邊只能在所有這些航線的公共路徑上

要如何快速打標記是個問題

二分已經有一個log,所以只能承受O(n)的判斷

如果能知道一條邊的經過次數,那么就知道這條邊是否在公共路徑上

容易想到樹上差分,預處理一波 lca 后復雜度可行

刪邊肯定貪心地刪能刪的最長邊

要如何判斷刪邊后是否最長路徑小于mid呢

顯然可以預處理出不刪前的最長路徑

如果最長路徑減去刪的邊 ≤ mid 那么其他路徑減刪去的邊肯定不大于mid(注意刪去的邊在所有原長超過mid的路徑上)

至于其他原長小于 mid 的路徑根本不用考慮

所以總結一下就是二分+樹上差分

luogu第13個點真是用sang心xin良bing苦kuang,把復雜度卡滿了

求LCA可能用樹剖會快一點,然而懶得寫...

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
inline int read()
{register int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }return x*f;
}
const int N=3e5+7;
int fir[N],from[N<<1],to[N<<1],val[N<<1],cntt;
inline void add(int &a,int &b,int &c)
{from[++cntt]=fir[a];fir[a]=cntt; to[cntt]=b; val[cntt]=c; 
}int f[N][21],dep[N],dis[N],frm[N];//f和dep用來求LCA,dis是點到根的距離,用來求最長路徑,frm是連接父節點的邊的編號
void dfs1(int &x,int &fa)//第一遍dfs處理f,dep,dis,frm
{f[x][0]=fa; dep[x]=dep[fa]+1;for(int i=1;i<=19;i++) f[x][i]=f[f[x][i-1]][i-1];for(int i=fir[x];i;i=from[i]){int &v=to[i]; if(v==fa) continue;dis[v]=dis[x]+val[i]; frm[v]=i; dfs1(v,x);}
}
inline int LCA(int x,int y)//求LCA
{if(dep[x]<dep[y]) swap(x,y);for(int i=19;i>=0;i--)if(dep[f[x][i]]>=dep[y]) x=f[x][i];if(x==y) return x;for(int i=19;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];return f[x][0];
}int n,m,cnt[N],lca[N],sum[N],tot,mxlen,rt=1;
//cnt是差分數組,lca顧名思義,sum[i]是第i條路徑的長度,tot記錄有幾條邊原長大于mid,mxlen是最長路徑長度,rt是根節點
struct data
{int a,b;
}d[N];//存運輸計劃
int pos;//記錄最長邊的編號
void dfs2(int &x)//dfs2處理每條邊經過次數
{for(int i=fir[x];i;i=from[i]){int &v=to[i]; if(v==f[x][0]) continue;dfs2(v); cnt[x]+=cnt[v];}if(cnt[x]==tot&&val[frm[x]]>val[pos]) pos=frm[x];//如果當前節點被所有大于mid的邊經過則考慮更新pos
}
inline bool pd(int &p)//判斷合法性,p就是mid
{tot=pos=0; memset(cnt,0,sizeof(cnt));//初始化for(register int i=1;i<=m;i++){if(sum[i]<=p) continue;cnt[d[i].a]++; cnt[d[i].b]++;cnt[lca[i]]-=2;tot++;//記錄差分
    }dfs2(rt);return mxlen-val[pos]>p ? 0 : 1;//判斷
}int main()
{int a,b,c;n=read(); m=read();for(register int i=1;i<n;i++){a=read(),b=read(),c=read();add(a,b,c); add(b,a,c);}dfs1(rt,rt);for(register int i=1;i<=m;i++){d[i].a=read(); d[i].b=read();lca[i]=LCA(d[i].a,d[i].b);//預處理lcasum[i]=dis[d[i].a]+dis[d[i].b]-(dis[lca[i]]<<1);//求出summxlen=max(mxlen,sum[i]);//嘗試更新maxlen
    }register int l=0,r=mxlen,mid;while(l<=r){mid=l+r>>1;pd(mid) ? r=mid-1 : l=mid+1;}printf("%d",l);return 0;
}

?

轉載于:https://www.cnblogs.com/LLTYYC/p/9828248.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279120.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279120.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279120.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 集合讀寫同步_JAVA多線程學習十六 - 同步集合類的應用

1.引言在多線程的環境中&#xff0c;如果想要使用容器類&#xff0c;就需要注意所使用的容器類是否是線程安全的。在最早開始&#xff0c;人們一般都在使用同步容器(Vector,HashTable),其基本的原理&#xff0c;就是針對容器的每一個操作&#xff0c;都添加synchronized來進行同…

Linux下的parted工具的使用 GPT分區安裝系統

安裝系統是安裝前時候ctrlatlF2 fdisk -l parted select /dev/sdb mklabel msdos # 將GPT磁盤格式化為MBR磁盤 對大硬盤進行分區 xfs 和 ntfs Linux下的parted工具的使用也很簡單&#xff0c;具體操作如下&#xff1a; rootme:/mnt# parted /dev/sda Using /dev/sda Welcome to…

ubuntu自定義菜單_如何自定義Ubuntu的每日消息

ubuntu自定義菜單Ubuntu displays an informative message, known as the message of the day, when a user logs in at the terminal. The MOTD is fully customizable — you can add your own text and other dynamic data. 當用戶在終端上登錄時&#xff0c;Ubuntu將顯示信…

java避免使用orderby_java – @OrderBy在JPA中無法正常工作

OrderBy如何運作&#xff1f;它在以下代碼中不起作用&#xff1a;Employee.javapackage com.semanticbits.pojo;import java.util.List;import javax.persistence.CascadeType;import javax.persistence.Embedded;import javax.persistence.Entity;import javax.persistence.Ge…

BigDecimal四舍五入與保留位

1.引言 借用《Effactive Java》這本書中的話&#xff0c;float和double類型的主要設計目標是為了科學計算和工程計算。他們執行二進制浮點運算&#xff0c;這是為了在廣域數值范圍上提供較為精確的快速近似計算而精心設計的。然而&#xff0c;它們沒有提供完全精確的結果&#…

火狐web開發清楚緩存_如何使用Firefox的Web開發工具

火狐web開發清楚緩存Firefox’s Web Developer menu contains tools for inspecting pages, executing arbitrary JavaScript code, and viewing HTTP requests and other messages. Firefox 10 added an all-new Inspector tool and updated Scratchpad. Firefox的Web Develop…

Leetcode400Nth Digit第N個數字

在無限的整數序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 個數字。 注意: n 是正數且在32為整形范圍內 ( n < 231)。 示例 1: 輸入: 3 輸出: 3 示例 2: 輸入: 11 輸出: 0 說明: 第11個數字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0&#xff0c;它是…

Java基類共同屬性設置_多選擇基類的訪問屬性-Java初學筆記

多選擇基類的訪問屬性你現在知道在定義類的訪間屬性時可用的選擇項&#xff0c;你希望使用這些類定義子類。你知道在類繼承上這些屬性所具有的效果&#xff0c;但是你如何決定到底應該使用哪一個呢?這里沒有死板和現成的規則&#xff0c;你選擇的訪問屬性取決于在將來你想用類…

IT:如何在Windows Server 2008 R2上安裝Hyper-V虛擬化

Windows Server 2008 R2 and later releases of the product ship with a virtualization platform called Hyper-V, which works quite well since it’s built into Windows. Today we’re going to show you how to install it. Windows Server 2008 R2和更高版本的產品附帶…

FineReport單行與數據庫交互的方法

1. 問題描述 我們在做一張報表填報的時候經常會遇到需要在一行進行添加動作&#xff0c;將該行數據直接與數據庫交互&#xff0c;執行存儲過程過程。我們可以通過每一行增加帆軟“插入”按鈕實現插入動作&#xff0c;并且在控件事件中增加和數據庫的交互&#xff0c;但當事件…

java cas volatile_每日一個知識點:Volatile 和 CAS 的弊端之總線風暴

每日一個知識點系列的目的是針對某一個知識點進行概括性總結&#xff0c;可在一分鐘內完成知識點的閱讀理解&#xff0c;此處不涉及詳細的原理性解讀。一、什么是總線風暴總線風暴&#xff0c;聽著真是一個帥氣的詞語&#xff0c;但如果發生在你的系統上那就不是很美麗了&#…

SqlServer之代碼塊相關

轉載必需注明出處:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/sqlserver-codeblock/ 一、go語句 Go語句是SqlServer中用來表示當前代碼塊結束提交并確認結果的語句。 Go語句不能和其他Sql命令卸載同一行上&#xff01; 定義的局部變量作用域局限在定義它的代碼…

010 使用list和tuple

list Python內置的一種數據類型是列表&#xff1a;list。list是一種有序的集合&#xff0c;可以隨時添加和刪除其中的元素。 比如&#xff0c;列出班里所有同學的名字&#xff0c;就可以用一個list表示&#xff1a; >>> classmates [Michael, Bob, Tracy] >>&g…

IT:如何使用Server 2008 R2上的遠程桌面服務設置自己的終端服務器

In today’s IT learning article, we are going to take a look at installing Terminal Services, otherwise known as Remote Desktop Services, on a Server 2008 R2 machine. 在今天的IT學習文章中&#xff0c;我們將介紹在Server 2008 R2計算機上安裝終端服務(也稱為遠程…

java 中的chartdata_獲取Helm Charts中的文件夾列表

獲得了位于templates文件夾之外的配置文件列表&#xff0c;我們將其輸入到如下的helm圖表中&#xff1a;├── configs│ ├── AllEnvironments│ │ ├── Infrastructure│ │ └── Services│ │ ├── ConfigFile1│ │ ├── ConfigFile2│ ├…

Win10 jdk的安裝以及環境變量的配置,及需要注意的坑

此篇文章獻給自己&#xff0c;希望下次長點記性 最近本人終于有時間開始學習appium&#xff0c;并且開始在電腦上配置環境&#xff0c;第一步就是在我那剛裝的Win10 系統上安裝jdk&#xff0c;過程并不順利&#xff0c;由于之前都是用的win7&#xff0c;幾乎都是一路的下一步&a…

java部分服務出現異常_Java web service 異常

1.org/apache/commons/discovery/tools/DiscoverSingletonException in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/discovery/tools/DiscoverSingleton缺少&#xff1a;commons-logging和commons-discovery2.ojava.lang.NoClassDefFoundErr…

Jenkins配置Findbugs做源代碼安全掃描

2019獨角獸企業重金招聘Python工程師標準>>> 此內容目標閱讀用戶&#xff1a;運維人員 配置步驟如下&#xff1a; Jenkins安裝Findbugs插件 Jenkins系統管理 → 管理插件 → (可選插件)找到Findbugs及其依賴插件全部安裝成功&#xff0c;Jenkins重啟&#xff0c;即可…

如何從USB運行Windows 8 Developer Preview

Running Windows 8 from a USB should not be confused with installing Windows on a USB drive–in this case, instead of installing it on the drive, we’re just running it straight from the portable drive. Here’s how to do it. 從USB運行Windows 8不應與在USB驅動…

PAT-乙級-1042 字符統計

請編寫程序&#xff0c;找出一段給定文字中出現最頻繁的那個英文字母。 輸入格式&#xff1a; 輸入在一行中給出一個長度不超過 1000 的字符串。字符串由 ASCII 碼表中任意可見字符及空格組成&#xff0c;至少包含 1 個英文字母&#xff0c;以回車結束&#xff08;回車不算在內…