P3573 [POI2014] RAJ-Rally

news/2024/9/19 20:45:52/文章来源:https://www.cnblogs.com/dcytrl/p/18418965

题意

给定一个 DAG,你需要删掉一个点使得原图的最长路径的长度最短,求出答案和方案。

\(n\le 5\times10^5,m\le 10^6\)

分析

DAG 的一条路径有一个优美的性质:一定是从拓扑序小的点指向拓扑序大的点。

考虑按照拓扑序从小到大处理每一个点。假设我们处理到了点 \(x\),它的拓扑序是 \(i\),设拓扑序小于 \(i\) 的点为左部点,拓扑序大于 \(i\) 的点为右部点。考虑将答案的贡献分为三部分:左部点内部、右部点内部、左部点到右部点。前两种贡献都很好算,第一种做正图 DP(设结果为 \(f_i\)),第二种做反图 DP(设结果为 \(g_i\))。至于第三种,把所有从左部点指向右部点的边单独拎出来(当然先把与 \(x\) 相连的入边删掉,注意到出边不会有贡献所以不用特别处理),那么经过一条边 \(u\rightarrow v\) 的最长路径是 \(f_u+g_v+1\),求最小值即可。

我们需要支持插入、删除、求最小值,可删堆/set 都可以。时间复杂度一个老哥。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<set>
#include<ctime>
#include<random>
#include<cassert>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define ITIE cin.tie(0);
#define OTIE cout.tie(0);
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define P0 puts("0")
#define P__ puts("")
#define PU puts("--------------------")
#define mp make_pair
#define fi first
#define se second
#define gc getchar
#define pc putchar
#define pb emplace_back
#define un using namespace
#define all(x) x.begin(),x.end()
#define rep(a,b,c) for(int a=(b);a<=(c);++a)
#define per(a,b,c) for(int a=(b);a>=(c);--a)
#define reprange(a,b,c,d) for(int a=(b);a<=(c);a+=(d))
#define perrange(a,b,c,d) for(int a=(b);a>=(c);a-=(d))
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
#define lowbit(x) (x&-x)
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define mem(x,y) memset(x,y,sizeof x)
//#define double long double
//#define int long long
//#define int __int128
using namespace std;
typedef long long i64;
typedef unsigned long long u64;
using pii=pair<int,int>;
bool greating(int x,int y){return x>y;}
bool greatingll(long long x,long long y){return x>y;}
inline int rd(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-48;ch=getchar();}return x*f;
}
inline void write(int x,char ch='\0'){if(x<0){x=-x;putchar('-');}int y=0;char z[40];while(x||!y){z[y++]=x%10+48;x/=10;}while(y--)putchar(z[y]);if(ch!='\0')putchar(ch);
}
bool Mbg;
const int maxn=5e5+5,maxm=4e5+5,inf=0x3f3f3f3f;
const long long llinf=0x3f3f3f3f3f3f3f3f;
int n,m;
struct Graph{vector<int>G[maxn];int f[maxn],in[maxn];int dfn[maxn],dfncnt;void add(int x,int y){G[x].emplace_back(y),in[y]++;}void solve(){queue<int>q;rep(i,1,n)if(!in[i])q.push(i);while(!q.empty()){int nw=q.front();q.pop(),dfn[nw]=++dfncnt;for(int u:G[nw]){f[u]=max(f[u],f[nw]+1);if(!(--in[u]))q.push(u);}}}
} A,B;
/*
a 左部点内的答案  
b 右部点内的答案
c 连接左部点和右部点的答案 
*/
multiset<int,greater<int> >a,b,c;
int d[maxn];
inline void solve_the_problem(){n=rd(),m=rd();rep(i,1,m){int x=rd(),y=rd();A.add(x,y),B.add(y,x);}A.solve(),B.solve();a.insert(-inf),b.insert(-inf),c.insert(-inf);rep(i,1,n)b.insert(B.f[i]);rep(i,1,n)d[A.dfn[i]]=i;int ans=inf,id=0;rep(i,1,n){int x=d[i];b.erase(b.find(B.f[x]));for(int u:B.G[x]){c.erase(c.find(A.f[u]+B.f[x]+1));}int res=max({*a.begin(),*b.begin(),*c.begin()});if(res<ans)ans=res,id=x;a.insert(A.f[x]);for(int u:A.G[x]){c.insert(A.f[x]+B.f[u]+1);}}write(id,32),write(ans);
}
bool Med;
signed main(){
//	freopen(".in","r",stdin);freopen(".out","w",stdout);
//	fprintf(stderr,"%.3lfMB\n",(&Mbg-&Med)/1048576.0);int _=1;while(_--)solve_the_problem();
}
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799433.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wpf简单自定义控件

用户控件(User Control)和自定义控件(Custom Control)的区别: UserControl: 将多个WPF控件(例如:TextBox,TextBlock,Button)进行组合成一个可复用的控件组; 由XAML和Code Behind代码组成; 不支持样式/模板重写; CustomControl 自定义控件,扩展自一个已经存在的控件,并…

应用AI技术的销售进化论

该文章聚焦AI技术在销售行业中的实际应用,解读销售人员如何利用先进技术及工具突破传统限制,增强业务能力帮助销售人员保持竞争优势,提升工作效率与业绩。 1、AI如何重塑销售规则 1.1 AI在销售领域的应用:不只是数字游戏 在销售领域,AI技术的引入正在重塑传统的销售模式,…

yum报错

参考这篇文章:https://www.cnblogs.com/kohler21/p/18331060Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was 14: curl#6 - "Could not re…

STM32H723+DMA+ADC多通道 问题记录

出现的问题1: ADC当开启扫描模式、DMA开始连续模式的时候,依然只能读出第一个通道的ADC的值,后面通道的AD值不更新。 尝试过将buf 固定在RAM_D3中也没有用。 实际最后问题在于,用STM32CubeMX配置工具生成代码的时候,ADC初始化的函数放在了DMA初始化的前面导致的问题。 出现…

改变您的HTTP服务器的缺省banner

原文链接:https://www.cnblogs.com/zmbhfly/p/10510594.html改变您的HTTP服务器的缺省banner 针对 IIS Asp.net,改变您的HTTP服务器的缺省banner引自:https://www.cnblogs.com/felixnet/p/6344613.html测试可以用,但仅仅是修改的应用程序,http://localhost不起作用 https:…

Paper Reading: Deep forest auto-Encoder for resource-Centric attributes graph embedding

本文设计了一种基于深度森林的embedding 学习方法 GraphDF,该方法可以实现以资源为中心的加权属性图的属性和拓扑信息的嵌入。提出的图预处理器包括基于自注意机制的潜在隐含特征挖掘、基于相似性和模块化相关转换对潜在隐含关系特征的深度一般信息挖掘。使编码器所提取的原始…

Hadoop(十五)项目考核 WordCount案例

一、需求分析需求:在给定的文本文件中统计输出每一个单词出现的总次数 SEVENTEEN.txt文本内容如下:say the name seventeen hello we are seventeen nice to meet you you very nice按照MapReduce编程规范,分别编写Mapper,Reducer,Driver1、Mapper (1)将MapTask传过来的…

和之大题解

1111... = 2^n-1长度为n的都是1的二进制数 = 2的n次方-1思路:对于每个数只有选或不选(1或0)的二进制,剩余见代码点击查看代码 #include<bits/stdc++.h> using namespace std; long long f[20]; int main(){freopen("202409C.in","r",stdin);freo…

2024-03-01 Windows MySQL5.7.27绿色版安装

背景 MySQL是常用数据库,其中版本已经有很多了,安装方式也有很多,联网装、安装包等。不仅安装麻烦,卸载也很麻烦。因此笔者一般都是使用绿色版安装,安装过程自己很清晰,每一步都知道自己做了什么,卸载时也很容易,自己安装的时候做了什么,卸载的时候删除什么就行了。 版…

Z-BlogPHP 模板文件与模板标签

在 Z-BlogPHP 中,模板文件和模板标签是非常重要的组成部分,用于生成前端页面。下面详细介绍 Z-BlogPHP 的模板文件结构和常用的模板标签。 模板文件结构 Z-BlogPHP 的模板文件通常位于 /zb_users/theme/你的主题名字/template/ 目录下。常见的模板文件包括:index.php:首页模…

Z-Blog的安装与升级注意事项

升级说明自动升级从下载页面下载最新版本的 Z-Blog 自动安装升级包。 解压缩安装包,并将包中文件上传至服务器。手动升级备份你的旧版 Z-Blog 程序到本地。 从下载页面下载最新版本的 Z-Blog 手动安装包。 解压缩安装包。 删除新版程序的 DATA 目录中的 zblog.mdb 文件,将旧数…

主机安装zblog 无法登陆:错误原因:登录失败

当你遇到在主机上安装 ZBlog 后无法登录后台,并且收到“错误原因:登录失败”的提示时,可以尝试以下几种方法来解决问题:检查用户名和密码:确认你输入的用户名和密码是否正确,注意区分大小写。清除浏览器缓存和Cookies:清除浏览器中的缓存数据和Cookies,有时候这些数据可…