【刷题】洛谷 P3573 [POI2014]RAJ-Rally
题目描述
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 Byteburg, connected with one way streets. Strangely enough, there are no cycles in the street network - if one can ride from intersection U to intersection V , then it is definitely impossible to get from V to U.
The rally's route will lead through Byteburg's streets. The motorcyclists plan to ride their blazing machines in the early morning of the rally day to one intersection and completely block it. The cyclists' association will then of course determine an alternative route but it could happen that this new route will be relatively short, and the cyclists will thus be unable to exhibit their remarkable endurance. Clearly, this is the motorcyclists' plan - they intend to block such an intersection that the longest route that does not pass through it is as short as possible.
给定一个N个点M条边的有向无环图,每条边长度都是1。
请找到一个点,使得删掉这个点后剩余的图中的最长路径最短。
输入输出格式
输入格式:
In the first line of the standard input, there are two integers, N and M(2<=N<=500 000,1<=M<=1 000 000), separated by a single space, that specify the number of intersections and streets in Byteburg. The intersections are numbered from to . The lines that follow describe the street network: in the -th of these lines, there are two integers, Ai, Bi(1<=Ai,Bi<=N,Ai<>Bi), separated by a single space, that signify that there is a one way street from the intersection no. Ai to the one no. Bi.
第一行包含两个正整数N,M(2<=N<=500 000,1<=M<=1 000 000),表示点数、边数。
接下来M行每行包含两个正整数A[i],B[i] (1<=A[i],B[i]<=N,A[i]<>B[i]),表示A[i]到B[i]有一条边。
输出格式:
The first and only line of the standard output should contain two integers separated by a single space. The first of these should be the number of the intersection that the motorcyclists should block, and the second - the maximum number of streets that the cyclists can then ride along in their rally. If there are many solutions, your program can choose one of them arbitrarily.
包含一行两个整数x,y,用一个空格隔开,x为要删去的点,y为删除x后图中的最长路径的长度,如果有多组解请输出任意一组。
输入输出样例
输入样例#1:
6 5
1 3
1 4
3 6
3 4
4 5
输出样例#1:
1 2
题解
一道神题
这题没用主席树,但用了权值线段树
建一个源点和汇点
拓扑排序后,用dp的方法求得图上正向边的最长路\(d[0]\)数组和反向边的最长路\(d[1]\)数组,类似于SPFA的\(d\)数组,但不要用SPFA求。本来我用的SPFA,结果T掉了
那么对于每一条边,一定包含这条边的图上的最长路就是这条边的出发点的\(d[0]\)加上这条边到达点的\(d[1]\),我们把这个值当做这条边的权值
那么删去一个点的话,就把以这个点为到达点的边的权值在权值线段树里删掉,然后就维护了删去了这个点后的最长路(存的就是跨过了要删去的点的路径的长度)
更新答案后再把以这个点为出发点的边的权值加到权值线段树里
(每次删掉一个点的时候并没有把与它相连的所有边都删掉,这样省时间)
#include<bits/stdc++.h>
#define ll long long
#define db double
#define ld long double
#define Mid ((l+r)>>1)
#define lson rt<<1,l,Mid
#define rson rt<<1|1,Mid+1,r
const int MAXM=2000000+10,MAXN=2000000+10,inf=0x3f3f3f3f;
int n,m,e[2],beg[2][MAXN],nex[2][MAXM],to[2][MAXM],w[2][MAXM],s,t,d[2][MAXN],p[MAXN],degree[MAXN],ans=inf,num,topo[MAXN],cnt;
std::queue<int> q;
struct Q_Tree{
int Max[MAXM],Num[MAXM];
inline void PushUp(int rt)
{
if(Max[rt<<1]>Max[rt<<1|1])Max[rt]=Max[rt<<1],Num[rt]=Num[rt<<1];
else Max[rt]=Max[rt<<1|1],Num[rt]=Num[rt<<1|1];
}
inline void Insert(int rt,int l,int r,int pos)
{
if(l==r)Max[rt]=pos,Num[rt]++;
else
{
if(pos<=Mid)Insert(lson,pos);
else Insert(rson,pos);
PushUp(rt);
}
}
inline void Delete(int rt,int l,int r,int pos)
{
if(l==r)
{
Num[rt]--;
if(!Num[rt])Max[rt]=0;
}
else
{
if(pos<=Mid)Delete(lson,pos);
else Delete(rson,pos);
PushUp(rt);
}
}
};
Q_Tree T;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char c='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(c!='\0')putchar(c);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void insert(int x,int y,int z)
{
to[0][++e[0]]=y;
nex[0][e[0]]=beg[0][x];
beg[0][x]=e[0];
w[0][e[0]]=z;
to[1][++e[1]]=x;
nex[1][e[1]]=beg[1][y];
beg[1][y]=e[1];
w[1][e[1]]=z;
}
inline void toposort()
{
for(register int i=1;i<=n;++i)
if(!degree[i])q.push(i);
while(!q.empty())
{
int x=q.front();
q.pop();
topo[++cnt]=x;
for(register int i=beg[0][x];i;i=nex[0][i])
{
degree[to[0][i]]--;
if(!degree[to[0][i]])q.push(to[0][i]);
}
}
}
int main()
{
read(n);read(m);
s=n+1;t=n+2;
for(register int i=1;i<=m;++i)
{
int u,v;
read(u);read(v);
degree[v]++;
insert(u,v,1);
}
toposort();
for(register int p=n;p>=1;--p)
for(register int x=topo[p],i=beg[0][x];i;i=nex[0][i])chkmax(d[1][x],d[1][to[0][i]]+1);
for(register int p=1;p<=n;++p)
for(register int x=topo[p],i=beg[0][x];i;i=nex[0][i])chkmax(d[0][to[0][i]],d[0][x]+1);
for(register int i=1;i<=n;++i)insert(s,i,0),insert(i,t,0);
for(register int i=1;i<=n;++i)T.Insert(1,1,n+2,d[1][i]);
d[0][s]=d[1][t]=-1;
for(register int t=1;t<=n;++t)
{
int x=topo[t];
for(register int i=beg[1][x];i;i=nex[1][i])T.Delete(1,1,n+2,d[0][to[1][i]]+d[1][x]+1);
if(T.Max[1]<ans)ans=T.Max[1],num=x;
for(register int i=beg[0][x];i;i=nex[0][i])T.Insert(1,1,n+2,d[0][x]+d[1][to[0][i]]+1);
}
write(num,' '),write(ans,'\n');
return 0;
}
【刷题】洛谷 P3573 [POI2014]RAJ-Rally的更多相关文章
- 洛谷 P3573 [POI2014]RAJ-Rally 解题报告
P3573 [POI2014]RAJ-Rally 题意: 给定一个\(N\)个点\(M\)条边的有向无环图,每条边长度都是\(1\). 请找到一个点,使得删掉这个点后剩余的图中的最长路径最短. 输入输 ...
- 【刷题】BZOJ 4543 [POI2014]Hotel加强版
Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...
- 洛谷 P3580 - [POI2014]ZAL-Freight(单调队列优化 dp)
洛谷题面传送门 考虑一个平凡的 DP:我们设 \(dp_i\) 表示前 \(i\) 辆车一来一回所需的最小时间. 注意到我们每次肯定会让某一段连续的火车一趟过去又一趟回来,故转移可以枚举上一段结束位置 ...
- 2018.10.30 一题 洛谷4660/bzoj1168 [BalticOI 2008]手套——思路!问题转化与抽象!+单调栈
题目:https://www.luogu.org/problemnew/show/P4660 https://www.lydsy.com/JudgeOnline/problem.php?id=1168 ...
- 洛谷 P3576 [POI2014]MRO-Ant colony
P3576 [POI2014]MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. ...
- 洛谷P3576 [POI2014]MRO-Ant colony [二分答案,树形DP]
题目传送门 MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. The ant h ...
- 洛谷P3567[POI2014]KUR-Couriers(主席树+二分)
题意:给一个数列,每次询问一个区间内有没有一个数出现次数超过一半 题解: 最近比赛太多,都没时间切水题了,刚好日推了道主席树裸题,就写了一下 然后 WA80 WA80 WA0 WA90 WA80 ?? ...
- AC日记——大爷的字符串题 洛谷 P3709
大爷的字符串题 思路: 莫队,需开O2,不开50: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20000 ...
- 洛谷P3572 [POI2014]PTA-Little Bird
P3572 [POI2014]PTA-Little Bird 题目描述 In the Byteotian Line Forest there are nn trees in a row. On top ...
随机推荐
- 旧的 .NET Core 项目重新打包出现提示版本不对问题
错误提示 当电脑更新 VS2017 版本后,如果同时有新的 .NET Core SDK 更新,打开旧的项目重新打包,可能会报这样的错误 NETSDK1061: 项目是使用 Microsoft.NETC ...
- Python-RabbitMQ(简单发送模型)
RabbitMQ需要 erlang 和pika 1.RabbitMQ和erlang版本必须匹配,否则就报没有进程错误 2.RabbitMQ的erlang.cookie和windows下的erlang. ...
- 02_python内置模块_timeit
timeit模块可以用来测试一小段python代码的执行速度. (1)timeit.Timer(stmt='pass', setup='pass', timer=<timer function& ...
- host命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/xin_y/article/details/53924763 分析域名查询工具,测试域名系统工作是否正常 语法: host ...
- M1阶段的开发过程的一些反思
今天八组队伍都做了项目的展示,和他们相比,我们的团队项目是显得最单薄的了,这里面的原因很多,固然我们团队整体的实力 比较弱,但是我们在M1项目开发过程中的种种错误表现也是导致我们项目失利的重要原因.下 ...
- Notes of Daily Scrum Meeting(11.10)
Notes of Daily Scrum Meeting(11.10) 今天是周一,虽然仍然在假期里,但是我们仍然要继续我们团队的开发工作了,分工大家已然都很明确,所以接下来 就是认真投入,把自己负责 ...
- 【Alpha】阶段第十次Scrum Meeting
[Alpha]阶段第十次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 登出接口 编写后端说明文档 赵智源 编写脚本实现测试的持续集成 前测试点页面跳转逻辑测试 ...
- java 框架 面试
Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC ...
- 17_常用API_第17天(包装类、System、Math、Arrays、大数据运算)_讲义
今日内容介绍 1.基本类型包装类 2.System类 3.Math类 4.Arrays类 5.大数据运算 01基本数据类型对象包装类概述 *A:基本数据类型对象包装类概述 *a.基本类型包装类的产生 ...
- elicpse
摘自http://blog.csdn.net/bug_love/article/details/72636505 eclipse error pages打红X的解决方法 我每次建一个Maven项目转为 ...