Description

题库链接

给定一个 \(N\) 个点 \(M\) 条边的有向无环图,每条边长度都是 \(1\)。请找到一个点,使得删掉这个点后剩余的图中的最长路径最短。

\(1\leq N\leq 500 000,1\leq M\leq 1 000 000\)

Solution

比较神...

值得注意的是,对于一张 \(\text{DAG}\) 的拓扑序,任意从中截断那么前一部分以及后一部分的点都是连续的。

考虑按拓扑序来做,我们需要维护的就只是左边一部分内的最长路,以及右边一部分内的最长路。

除此之外还要维护经过被“割开”边的最长路。

对于删除一个点,我们需要做的就是将“割边”转移,维护上述需要维护的信息。

可以用可删除的堆来实现,不过考虑到空间的花销,用权值线段树可以实现同样的功能。

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 500000+5, inf = ~0u>>1; int n, m, u, v, c1[N], c2[N], q[N];
struct graph {
struct tt {int to, next; }edge[N<<1];
int path[N], top, in[N];
void add(int u, int v) {edge[++top] = (tt){v, path[u]}, path[u] = top, ++in[v]; }
void topsort(int* c, int flag) {
queue<int>Q; int cnt = 0;
for (int i = 1; i <= n; i++) if (!in[i]) Q.push(i);
while (!Q.empty()) {
int u = Q.front(); Q.pop(); if (flag) q[++cnt] = u;
for (int i = path[u]; i; i = edge[i].next) {
--in[edge[i].to]; c[edge[i].to] = max(c[edge[i].to], c[u]+1);
if (in[edge[i].to] == 0) Q.push(edge[i].to);
}
}
}
}g1, g2;
struct Segment_tree {
#define lr(o) (o<<1)
#define rr(o) (o<<1|1)
int mx[N<<2], cnt[N<<2];
Segment_tree() {memset(mx, -1, sizeof(mx)); }
void modify(int o, int l, int r, int loc, int key) {
if (l == r) {
cnt[o] += key;
if (cnt[o] == 1) mx[o] = l;
else if (cnt[o] == 0) mx[o] = -1;
return;
}
int mid = (l+r)>>1;
if (loc <= mid) modify(lr(o), l, mid, loc, key);
else modify(rr(o), mid+1, r, loc, key);
mx[o] = max(mx[lr(o)], mx[rr(o)]);
}
}T; void work() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v); g1.add(u, v), g2.add(v, u);
}
g1.topsort(c1, 1), g2.topsort(c2, 0);
int ans = inf, pos;
for (int i = 1; i <= n; i++) T.modify(1, 0, n, c2[i], 1);
for (int id = 1; id <= n; id++) {
int u = q[id];
for (int i = g2.path[u]; i; i = g2.edge[i].next)
T.modify(1, 0, n, c2[u]+c1[g2.edge[i].to]+1, -1);
T.modify(1, 0, n, c2[u], -1);
if (T.mx[1] < ans) ans = T.mx[1], pos = u;
for (int i = g1.path[u]; i; i = g1.edge[i].next)
T.modify(1, 0, n, c1[u]+c2[g1.edge[i].to]+1, 1);
T.modify(1, 0, n, c1[u], 1);
}
printf("%d %d\n", pos, ans);
}
int main() {work(); return 0; }

[POI 2014]RAJ-Rally的更多相关文章

  1. bzoj 3522 / 4543 [POI 2014] Hotel - 动态规划 - 长链剖分

    题目传送门 bzoj 3522 需要root权限的传送点 bzoj 4543 快速的传送点 慢速的传送点 题目大意 给定一棵树,问有多少个无序三元组$(x, y, z)$使得这三个不同点在树上两两距离 ...

  2. 解题:POI 2014 Ant colony

    题面 既然我们只知道最后数量为$k$的蚂蚁会在特殊边上被吃掉,不妨逆着推回去,然后到达每个叶节点的时候就会有一个被吃掉的蚂蚁的区间,然后二分一下就好啦 #include<cstdio> # ...

  3. POI 2014 HOTELS (树形DP)

    题目链接 HOTELS 依次枚举每个点,以该点为中心扩展. 每次枚举的时候,从该点的儿子依次出发,搜完一个儿子所有的点之后进行答案统计. 这里用了一个小trick. #include <bits ...

  4. [POI 2014] Couriers

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3524 [算法] 首先离线 , 将询问按右端点排序 如果我们知道[l , r]这个区间 ...

  5. [POI 2014] Little Bird

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3831 [算法] 单调队列优化动态规划 时间复杂度 : O(N) [代码] #incl ...

  6. bzoj 3872 [ Poi 2014 ] Ant colony —— 二分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3872 从食蚁兽所在的边向叶节点推,会得到一个渐渐放大的取值区间,在叶子节点上二分有几群蚂蚁符 ...

  7. [POI 2014]PTA-Little Bird

    Description 题库连接 给你 \(n\) 棵树,第 \(i\) 棵树的高度为 \(d_i\).有一只鸟从 1 号树出发,每次飞跃不能超过 \(k\) 的距离.若飞到下一棵树的高度大于等于这一 ...

  8. Solution -「POI 2014」「洛谷 P5904」HOT-Hotels 加强版

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的树,求无序三元组 \((u,v,w)\) 的个数,满足其中任意两点树上距离相等.   \(n\le1 ...

  9. POI题解整合

    我也不知道为啥我就想把POI的题全都放到一篇blog里写完. POI 2005 SAM-Toy Cars 贪心,每次选下次出现最晚的. POI 2006 KRA-The Disks 箱子位置单调,所以 ...

随机推荐

  1. c++日志输出库 spdlog 简介(3)多线程控制台输出日志

    spdlog源码分析:https://www.cnblogs.com/eskylin/p/6483199.html spdlog的异步模式使得spdLog可以支持多线程,于是写了一个多线程的小例子: ...

  2. asp.net—策略模式

    一.什么是策略模式 定义:定义一系列算法,把一个个算法封装成独立类并实现同一个接口,使得它们之间可以相互替换. 二.怎么使用策略模式 首先模拟一个场景:有一个用户想买车.  可以有多种方式买车: (1 ...

  3. 20181015记录一个简单的TXT日志类

    20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...

  4. 深入理解Aspnet Core之Identity(4)

    主题 之前简单介绍了Asp.net core 的初步的使用,本篇我打算给大家介绍一下Identity的架构,让大家对Identity有一个总体的理解和认识. 简介 博客原文欢迎访问我的博客网站,地址是 ...

  5. C#之使用CefSharp创建客户端

    安装NuGet包 在Visio studio中右击解决方案,选择管理NuGet包,搜索安装CefSharp.WinForms. 配置工作 (1)首先右击项目选择属性,在"生成"选项 ...

  6. js url 参数 转换成 json 对象数据

    some=params&over=here => {"some":"params","over":"here&quo ...

  7. 【Selenium专题】元素定位之一简单定位

    UI自动化工具千变万化.架构千变万化,但都逃离不开的关键一步就是元素定位.下面以Selenium为例介绍常见的几个元素定位方法 ID -元素id属性 WebElement El = driver.fi ...

  8. JSOI2010 满汉全席

    题目链接:戳我 一个2-SAT的模板题. (什么是2-SAT呢?就是解决一个情况两种决策的问题,我们根据"选了其中一个点A就必须选一个点B的原则,从A向B连边.最后判断如果在一个强连通分量里 ...

  9. 二:maven构建module

    通常情况下,我们一个项目是需要分多个模块的,这是我们用maven管理项目就需要构建一个多模块的项目: 通常的结构是一个模块中有一个主项目,下面包含多个子项目,如果是web项目则子项目中有一个是java ...

  10. 话谈C#第一天

    今天是第一次接触C#,由于长时间的做Java开发,突然转到C#非常的不自然,但是也有了一些收获,给大家分享一下 using System; using System.Collections.Gener ...