[POI 2014]RAJ-Rally
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的更多相关文章
- bzoj 3522 / 4543 [POI 2014] Hotel - 动态规划 - 长链剖分
题目传送门 bzoj 3522 需要root权限的传送点 bzoj 4543 快速的传送点 慢速的传送点 题目大意 给定一棵树,问有多少个无序三元组$(x, y, z)$使得这三个不同点在树上两两距离 ...
- 解题:POI 2014 Ant colony
题面 既然我们只知道最后数量为$k$的蚂蚁会在特殊边上被吃掉,不妨逆着推回去,然后到达每个叶节点的时候就会有一个被吃掉的蚂蚁的区间,然后二分一下就好啦 #include<cstdio> # ...
- POI 2014 HOTELS (树形DP)
题目链接 HOTELS 依次枚举每个点,以该点为中心扩展. 每次枚举的时候,从该点的儿子依次出发,搜完一个儿子所有的点之后进行答案统计. 这里用了一个小trick. #include <bits ...
- [POI 2014] Couriers
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3524 [算法] 首先离线 , 将询问按右端点排序 如果我们知道[l , r]这个区间 ...
- [POI 2014] Little Bird
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3831 [算法] 单调队列优化动态规划 时间复杂度 : O(N) [代码] #incl ...
- bzoj 3872 [ Poi 2014 ] Ant colony —— 二分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3872 从食蚁兽所在的边向叶节点推,会得到一个渐渐放大的取值区间,在叶子节点上二分有几群蚂蚁符 ...
- [POI 2014]PTA-Little Bird
Description 题库连接 给你 \(n\) 棵树,第 \(i\) 棵树的高度为 \(d_i\).有一只鸟从 1 号树出发,每次飞跃不能超过 \(k\) 的距离.若飞到下一棵树的高度大于等于这一 ...
- Solution -「POI 2014」「洛谷 P5904」HOT-Hotels 加强版
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的树,求无序三元组 \((u,v,w)\) 的个数,满足其中任意两点树上距离相等. \(n\le1 ...
- POI题解整合
我也不知道为啥我就想把POI的题全都放到一篇blog里写完. POI 2005 SAM-Toy Cars 贪心,每次选下次出现最晚的. POI 2006 KRA-The Disks 箱子位置单调,所以 ...
随机推荐
- 解决 Eclipse Indigo 3.7、ADT 中文字体偏小,完美 Consolas 微软雅黑混合字体!
Eclipse是著名的跨平台的自由集成开发环境(IDE).6月22日Eclipse 3.7 正式发布,代号是 Indigo . 在 Windows 7 下初始后化,发现界面变化不大,但中文字体却面目全 ...
- linux系统编程之信号(七):被信号中断的系统调用和库函数处理方式
一些IO系统调用执行时, 如 read 等待输入期间, 如果收到一个信号,系统将中断read, 转而执行信号处理函数. 当信号处理返回后, 系统遇到了一个问题: 是重新开始这个系统调用, 还是 ...
- Android开发基于百度地图的乘车助手
写在前面: 出去玩免不了挤公交.等地铁,不知道乘车方案当然不行,用官方APP吧,缺点一大堆,手机浏览器在线查的话既慢又麻烦...为了解决这些问题,我们来做一个简版的出行助手,嘛嘛再也不用担心我会迷路了 ...
- 【C#进阶】委托那些事儿(一)
一.简单的委托 1.1 委托的声明: C#当中,委托(delegate)是一种方法封装,也即委托对象可以作为一种传递方法的变量来使用. 委托也算是一种类,与类是平级的存在.在类中写delegate对象 ...
- Android 流媒体播放 live streaming
安卓支持的协议 RTSP (RTP, SDP)HTTP/HTTPS progressive streamingDynamic adaptive streaming on HTTP => MPEG ...
- CentOS 7 - 安装Windows字体!
1,安装cabextract: 下载地址:http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el7/en/x86_64/rpmforge/RPMS/cabe ...
- http 缓存策略浅析
从一道经典的面试题说起 "用户输入 URL 到浏览器显示页面,这个过程发生了什么?",作为前端开发,这个题目相信大家并不陌生.楼主的答案分为两部: 一.网络通信 应用层 DNS 域 ...
- nodejs之模块加载机制
nodejs模块加载原理 node加载模块步骤: 1) 路径分析 (如判断是不是核心模块.是绝对路径还是相对路径等) 2) 文件定位 (文件扩展名分析, 目录和包处理等细节) 3) 编译执行 原生模块 ...
- JS: 数据结构与算法之栈
栈 先来看一道题 Leetcode 32 Longest Valid Parentheses (最长有效括号) 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 ...
- 页面按钮埋点+跟踪location.search
<a href="javascript: void(0)" onclick="setUrl('https://baoxian.pingan.com/pa18shop ...