题意 题目链接 Sol 最直观的思路是求出删除每个点后的最长路,我们考虑这玩意儿怎么求 设\(f[i]\)表示以\(i\)结尾的最长路长度,\(g[i]\)表示以\(i\)开始的最长路长度 根据DAG的性质,显然我们删除一个点后,整个集合会被分成两部分:拓扑序小于/大于当前点 那么此时的最长路一定可以通过计算连接着两个集合的边\((u, v)\)的\(f(u) + f(v) +1\)得到 这样的话我们可以直接维护边集,在统计每个点的答案的时候首先删掉入边的贡献统计答案,统计完后再加入出边的贡献…
3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved: 84[Submit][Status][Discuss] Description An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long distance cyclists…
题目链接 BZOJ3832 题解 神思路orz,根本不会做 设\(f[i]\)为到\(i\)的最长路,\(g[i]\)为\(i\)出发的最长路,二者可以拓扑序后\(dp\)求得 那么一条边\((u,v)\)的对应的最长链就是\(f[u] + 1 + g[v]\) 我们人为加入源汇点\(S\),\(T\),\(S\)向每个点连边,每个点向\(T\)连边 我们考虑把整个图划分开 一开始所有点都在\(T\)这边,割边为所有\(S\)的边 然后我们按照拓扑序把点逐一加入\(S\)集合中 加入时,我们删去…
题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long distance cyclists. Local representatives of motorcyclists, long feuding the cyclists, have decided to sabotage the event. There are   intersections in B…
传送门-> 这题的原理看上去很神奇. 称拓扑图中入度为0的点为“起点”,出度为0的点为“终点”. 因为“起点”和“终点”可能有很多个,算起来会很麻烦,所以新建“超级起点”S,向所有点连边,“超级终点”T,所有点向它连边.这样原图中的最长路就是新图中的最长路-2. dis[a->b]表示a到b的距离. 对于一个拓扑图而言,它的一个割集中肯定有一条边在最长路上.对于每条边,可以将dis[S->该边起点]和dis[该边终点->T]算出,那么该边所在路径中的最长的一个就是dis[S->…
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…
[BZOJ3832][POI2014]Rally(拓扑排序,动态规划) 题面 BZOJ,权限题 洛谷 题解 这题好强啊,感觉学了好多东西似的. 首先发现了一个图画的很好的博客,戳这里 然后我来补充一下这题到底怎么做. 首先这个图是一个\(DAG\),我们对其进行拓扑排序,设\(f[i]\)表示以\(i\)开头的最长链长度,\(g[i]\)表示以\(i\)结尾的最长链长度,那么经过某条边\(u\rightarrow v\)的边贡献的最长路的贡献就是\(g[u]+f[v]+1\). 我们发现,如果我…
无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB Submit: 1001 Solved: 490 [Submit][Status][Discuss] Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1 到N的顺序…
OJ题号:BZOJ3832.洛谷3573 思路: 建立超级源汇$S$和$T$,DP求出分别以$S$和$T$为源点的最长路$diss$和$dist$. 对于每条边$i$,设定一个权值$w_i=diss_{i.from}+dist_{i.to}-1$. 表示原图中包含这条边的从$S$到$T$的最长路. 然后按照拓扑序删点$x$,用堆维护不包含$x$的最长路长度. 然而一次性不能把所有边放进去,不然会MLE一个点(因为这个调了一个晚上). 应该在换$x$的时候,把老$x$的出边重新加入,并将新$x$的…
3832: [Poi2014]Rally 链接 分析: 首先可以考虑删除掉一个点后,计算最长路. 设$f[i]$表示从起点到i的最长路,$g[i]$表示从i出发到终点的最长路.那么经过一条边的最长路就是$f[u]+1+g[v]$. 删除一个点x后,会使一些路径没了.考虑这些路径的特点.我们它比x拓扑序小的设为集合S,拓扑序大的设为T. 1.如果以前的一条路径经过x,那么去掉x后,考虑如何去掉这些路径的影响.只需将x的入边删掉就行了. 2.那么如何统计新的答案,并且新的路径不能经过x.此处是一个有…