洛谷 2680 (NOIp2015) 运输计划
2024-09-27 06:31:29
题目:https://www.luogu.org/problemnew/show/P2680
因为是最长的时间最短,所以二分!
离线LCA可以知道路径长度。每次只看超过二分值的路径。
原本的想法是遍历一下每条超过二分值的路径,找出“去掉它就能使该路径合法”的那些边,打上标记,最后找到有k个标记的边就能行。
但有点不合适。不需要找出“……”的那些边,而把所有该路径上的边都打上标记,最后找到有k个标记的边的时候判断一下去掉它能不能行。
这样就像均摊了复杂度一样。反正最后都得遍历树,可以那时多做一点、之前少做一点,使时间更好。
注意给边打标记是把它落在它下面的那个点上。而且是LCA的地方-2,和给点打标记不同。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=3e5+;
int n,m,head[N],xnt,cs[N],bh[N],l,r,mx,fa[N],hd[N],xt,dis[N],nw,mid,ans;
bool vis[N],flag;
struct Ques{
int dis,x,y,lca;
}a[N];
struct Edge{
int next,to,w;
Edge(int n=,int t=,int w=):next(n),to(t),w(w) {}
}edge[N<<],ed[N<<];
void add(int x,int y,int z)
{
edge[++xnt]=Edge(head[x],y,z);head[x]=xnt;
edge[++xnt]=Edge(head[y],x,z);head[y]=xnt;
}
void ad(int x,int y,int z)
{
ed[++xt]=Edge(hd[x],y,z);hd[x]=xt;
ed[++xt]=Edge(hd[y],x,z);hd[y]=xt;
}
int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
bool cmp(Ques a,Ques b){return a.dis>b.dis;}
void tarjan(int cr,int f)
{
vis[cr]=;
for(int i=hd[cr],v;i;i=ed[i].next)
if(vis[v=ed[i].to])
{
int k=ed[i].w,lc=find(v);
a[k].lca=lc;a[k].dis=dis[cr]+dis[v]-*dis[lc];
mx=max(mx,a[k].dis);
}
for(int i=head[cr],v;i;i=edge[i].next)
if((v=edge[i].to)!=f)
{
bh[v]=i;
dis[v]=dis[cr]+edge[i].w;
tarjan(v,cr);fa[v]=cr;
}
}
void solve(int cr)
{
cs[a[cr].x]++;cs[a[cr].y]++;cs[a[cr].lca]-=;
}
int dfs(int cr,int f)
{
int ret=cs[cr];
for(int i=head[cr],v;i;i=edge[i].next)
if((v=edge[i].to)!=f)
{
ret+=dfs(v,cr);if(flag)return ;
}
if(ret==nw&&mx-edge[bh[cr]].w<=mid)flag=;
return ret;
}
int main()
{
scanf("%d%d",&n,&m);int x,y,z;
for(int i=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);add(x,y,z);
fa[i]=i;
}
fa[n]=n;
for(int i=;i<=m;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);ad(a[i].x,a[i].y,i);
}
tarjan(,);sort(a+,a+m+,cmp);r=mx;
while(l<=r)
{
mid=((l+r)>>);memset(cs,,sizeof cs);
for(nw=;nw<=m&&a[nw].dis>mid;nw++)solve(nw);
nw--;flag=;dfs(,);
if(flag)ans=mid,r=mid-;
else l=mid+;
}
printf("%d",ans);
return ;
}
最新文章
- JS中的 变量提升
- Access数据库参数没值
- Xcode和IOS模拟器
- BZOJ 4302 Buildings 解题报告
- 重置mysql密码
- MATLAB - 为什么imshow(g,[])可以正常显示,而imshow(g)却显示空白图像?
- css响应式布局
- dict-命令行下中英文翻译工具
- mysql 导入出csv
- Go+Python双剑合璧
- Android系统分区理解及分区目录细解【转】
- 阿里云esc云服务器IP不能访问的解决办法
- Log4net 日志传到 graylog监控
- mabatis报错 Result Maps collection already contains value for gamedataserver.dao.one.ChargeRecordMapper.BaseResultMap
- [PY3]——IO——文件读写
- 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元
- Python 函数 -hasattr()
- 跟我学习css3之transition
- Timer类注意事项
- Linux下inotify的基本使用及注意事项