f[0][i]为i出发的最长路,f[1][i]为到i的最长路

新建源汇S,T,S向每个点连边,每个点向T连边

将所有点划分为两个集合S与T,一开始S中只有S,其它点都在T中

用一棵线段树维护所有连接属于两个集合的点的边,权值为f[1][u]+f[0][v]

按拓扑序依次计算去掉每个点后图中的最长路

对于当前计算的点x,先将所有连向x的边删除,此时最长路长度为线段树中的最大值

然后再将所有x出发的边加入线段树中

时间复杂度$O(m\log n)$

#include<cstdio>
#define N 500010
int n,m,i,j,x,y,g[2][N],nxt[2][N<<2],v[2][N<<2],ed,d[N],q[N],l,r,fin,ans,f[2][N],S,T,val[N<<2];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y){
d[x]++;v[0][++ed]=y;nxt[0][ed]=g[0][x];g[0][x]=ed;
v[1][ed]=x;nxt[1][ed]=g[1][y];g[1][y]=ed;
}
inline void ins(int c,int d){
int x=1,a=0,b=n,mid;
while(a<=b){
val[x]+=d;
if(a==b)return;
mid=(a+b)>>1;x<<=1;
if(c<=mid)b=mid;else a=mid+1,x|=1;
}
}
inline int ask(){
int x=1,a=0,b=n,mid;
while(a<b){
mid=(a+b)>>1;x<<=1;
if(val[x|1])a=mid+1,x|=1;else b=mid;
}
return a;
}
int main(){
read(n),read(m);
while(m--)read(x),read(y),add(x,y);
for(i=1;i<=n;i++)if(!d[i])q[++r]=i;
while(l<=r)for(i=g[1][q[l++]];i;i=nxt[1][i])if(!(--d[v[1][i]]))q[++r]=v[1][i];
for(i=1;i<=n;i++)for(j=g[0][x=q[i]];j;j=nxt[0][j])if(f[0][y=v[0][j]]>=f[0][x])f[0][x]=f[0][y]+1;
for(i=n;i;i--)for(j=g[1][x=q[i]];j;j=nxt[1][j])if(f[1][y=v[1][j]]>=f[1][x])f[1][x]=f[1][y]+1;
for(S=n+1,T=S+1,i=1;i<=n;i++)add(S,i),add(i,T);
for(i=1;i<=n;i++)ins(f[0][i],1);
for(fin=i=n;i;i--){
for(j=g[1][x=q[i]];j;j=nxt[1][j])ins(f[1][v[1][j]]+(v[1][j]<=n)+f[0][x],-1);
if((y=ask())<fin)ans=x,fin=y;
for(j=g[0][x];j;j=nxt[0][j])ins(f[0][v[0][j]]+(v[0][j]<=n)+f[1][x],1);
}
return printf("%d %d",ans,fin),0;
}

  

BZOJ3832 : [Poi2014]Rally的更多相关文章

  1. BZOJ3832[Poi2014]Rally——权值线段树+拓扑排序

    题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long di ...

  2. BZOJ3832 [Poi2014]Rally 【拓扑序 + 堆】

    题目链接 BZOJ3832 题解 神思路orz,根本不会做 设\(f[i]\)为到\(i\)的最长路,\(g[i]\)为\(i\)出发的最长路,二者可以拓扑序后\(dp\)求得 那么一条边\((u,v ...

  3. BZOJ3832: [Poi2014]Rally(拓扑排序 堆)

    题意 题目链接 Sol 最直观的思路是求出删除每个点后的最长路,我们考虑这玩意儿怎么求 设\(f[i]\)表示以\(i\)结尾的最长路长度,\(g[i]\)表示以\(i\)开始的最长路长度 根据DAG ...

  4. 并不对劲的bzoj3832: [Poi2014]Rally

    传送门-> 这题的原理看上去很神奇. 称拓扑图中入度为0的点为“起点”,出度为0的点为“终点”. 因为“起点”和“终点”可能有很多个,算起来会很麻烦,所以新建“超级起点”S,向所有点连边,“超级 ...

  5. 【BZOJ3832】[POI2014]Rally(拓扑排序,动态规划)

    [BZOJ3832][POI2014]Rally(拓扑排序,动态规划) 题面 BZOJ,权限题 洛谷 题解 这题好强啊,感觉学了好多东西似的. 首先发现了一个图画的很好的博客,戳这里 然后我来补充一下 ...

  6. 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)

    3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved:  ...

  7. 3832: [Poi2014]Rally

    3832: [Poi2014]Rally 链接 分析: 首先可以考虑删除掉一个点后,计算最长路. 设$f[i]$表示从起点到i的最长路,$g[i]$表示从i出发到终点的最长路.那么经过一条边的最长路就 ...

  8. [POI2014]Rally

    OJ题号:BZOJ3832.洛谷3573 思路: 建立超级源汇$S$和$T$,DP求出分别以$S$和$T$为源点的最长路$diss$和$dist$. 对于每条边$i$,设定一个权值$w_i=diss_ ...

  9. 【bzoj3832】Rally

    Portal -->bzoj3832 Description ​ 给你一个DAG,每条边长度都是\(1\),请找一个点满足删掉这个点之后剩余图中的最长路最短 Solution ​​ 这题的话感觉 ...

随机推荐

  1. RemObjects SDK Source For Delphi XE7

    原文:http://blog.csdn.net/tht2009/article/details/39545545 1.目前官网最新版本是RemObjects SDK for Delphi and al ...

  2. 阿里云vps上mysql挂掉的解决办法

    阿里云vps上mysql挂掉的解决办法 4条回复 用阿里云的vps用作blog服务器,系统很稳定,已经100多天一直运行正常,大概从上个月开始发现blog的mysql会有时挂掉,会收到短信通知.之前没 ...

  3. ubuntu apt-get update 失败解决

    在执行 sudo apt-get update 之后  会出现如下错误 这是要检测网络是否有问题 因为我之前只使用nfs挂载的时候,在虚拟机  编辑-> 虚拟网络编辑器里面->更改设置里面 ...

  4. Properties类一些常用的用法

    直接上代码: package test.properties; import java.io.File; import java.io.FileInputStream; import java.io. ...

  5. cocos2d-x如何解决图片显示模糊问题

    转载http://zhidao.baidu.com/link?url=JTUKP5quGfMQixLZSvtC2XlKMkQDyQbYW72_DRyD6KDRpkLs8_6poQtKkwsyqzU8q ...

  6. Javascript配合jQuery实现流畅的前端验证

    做前端时一般都习惯用JavaScript进行表单的简单验证比如非空验证和正则表达式验证,这样过滤后的数据提交到服务端再由专门的控制器做数据处理,这样能减轻服务器的负担,下面看一下前端验证的简单步骤: ...

  7. mysql源码:关于innodb中两次写的探索

    两次写可以说是在Innodb中很独特的一个功能点,而关于它的说明或者解释非常少,至于它存在的原因更没有多少文章来说,所以我打算专门对它做一次说明. 首先说明一下为什么会有两次写这个东西:因为innod ...

  8. AJAX省市县三级联动

    效果 开发结构参考AJAX,JSON用户校验 主要有两个核心文件 1,处理输入字符,进行后台搜索的servlet linkage.java package org.guangsoft.servlet; ...

  9. Java性能优化权威指南-读书笔记(三)-JVM性能调优-内存占用

    新生代.老年代.永久代的概念不多说,这三个空间中任何一个不能满足内存分配请求时,就会发生垃圾收集. 新生代不满足内存分配请求时,发生Minor GC,老年代.永久代不满足内存分配请求时,发生Full ...

  10. javaweb数据库操作

    本文主要内容有C3P0数据库连接池,dbutils的使用,元数据的应用 在对数据库进行增删改查时,使用数据库连接池可以有效的提高效率,节省资源,C3P0是Apache组织提供的一个有效方式 C3P0的 ...