P3573-[POI2014]RAJ-Rally【拓扑排序,二分+树状数组】

正题

题目链接:https://www.luogu.com.cn/problem/P3573


题目大意

nnn个点mmm条边的DAGDAGDAG,删掉一个点使得最长路最短。


解题思路

先跑一遍拓扑排序
dsids_idsi表示以iii结尾的最长路,dtidt_idti表示以iii开头的最长路,用拓扑序+dp可以搞定

定义两个点集SSSTTT,我们先将所有所有点放入TTT集合,并且把dtdtdt放入一个数据结构里。

然后按照拓扑序枚举从小到大删除哪个点,枚举到的点xxx我们把dtxdt_xdtx从数据结构里删除,对于y−>xy->xy>x我们可以把dsy+dtx+1ds_y+dt_x+1dsy+dtx+1从数据结构里删除。

然后查询最小值统计答案

之后把dsxds_xdsx和对于x−>yx->yx>y我们有dsx+dty+1ds_x+dt_y+1dsx+dty+1都丢进数据结构里。

这里用树状数组+二分统计答案。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define lowbit(x) (x&-x)
using namespace std;
const int N=1e6+10;
struct node{int to,next;
}a[N];
queue<int> q;
int n,m,cnt,ans,id;
int in[N],top[N],ds[N],dt[N],ls[N];
vector<int> init[N];
struct Tree_Array{int t[N];void Change(int x,int val){if(!x) return;while(x<=m){t[x]+=val;x+=lowbit(x);}return;}int Ask(int x){int ans=0;while(x){ans+=t[x];x-=lowbit(x);}return ans;}int Maxs(){int z=Ask(m);int l=0,r=m;while(l<=r){int mid=(l+r)>>1;if(Ask(mid)==z)r=mid-1;else l=mid+1;}return l;}
}T;
void Top_Sort(){for(int i=1;i<=n;i++)if(!in[i])q.push(i),top[++cnt]=i;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;in[y]--;if(!in[y])q.push(y),top[++cnt]=y;}}return;
}
void Get_Dis(){for(int i=1;i<=n;i++){int x=top[i];for(int j=ls[x];j;j=a[j].next){int y=a[j].to;ds[y]=max(ds[y],ds[x]+1);}}for(int i=n;i>=1;i--){int x=top[i];for(int j=0;j<init[x].size();j++){int y=init[x][j];dt[y]=max(dt[y],dt[x]+1);}}return;
}
void Solve(){ans=2147483647;for(int i=1;i<=n;i++)T.Change(dt[i],1);for(int k=1;k<=n;k++){int x=top[k];T.Change(dt[x],-1);for(int i=0;i<init[x].size();i++){int y=init[x][i];T.Change(ds[y]+dt[x]+1,-1);}int z=T.Maxs();if(z<ans) ans=z,id=x;T.Change(ds[x],1);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;T.Change(ds[x]+dt[y]+1,1);}}return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);a[i].to=y;a[i].next=ls[x];ls[x]=i;in[y]++;init[y].push_back(x);}Top_Sort();Get_Dis();Solve();printf("%d %d",id,ans);
}

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

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

相关文章

读上瘾-让用户养成习惯

1、凡是成功的创新都有一个共性&#xff1a;能够解决问题&#xff0c;看似明确&#xff0c;实则复杂&#xff0c;因为人们总是对新产品应该解决何种问题各执一词。 3、产品不只是满足功能&#xff0c;还要反映人性。好的产品是一件作品&#xff0c;好的技术几近于艺术&#xf…

.Net Core小技巧 - 使用Swagger上传文件

前言随着前后端分离开发模式的普及&#xff0c;后端人员更多是编写服务端API接口。调用接口实现文件上传是一个常见的功能&#xff0c;同时也需要一个选择文件上传的界面&#xff0c;可以编写前端界面上传&#xff0c;可以使用Postman、curl来模拟上传请求。上述的方式多多少少…

【动态规划】数字金字塔

数字金字塔 Description 考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。 每一步可以走到左下方的点也可以到达右下方的点。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径…

读极致产品

1、极致产品 用户的痛点&#xff0c;项目的需求是什么&#xff1f;准确吗&#xff1f;是不是真需求&#xff1f;如何抓住用户的真需求&#xff0c;如何深入用户需求做产品。要站在用户的角度思考问题&#xff0c;了解用户的刚需、痛点。商业的本质是让人性得到释放&#xff0c;…

P4555-[国家集训队]最长双回文串【Manacher】

正题 题目链接:https://www.luogu.com.cn/problem/P4555 题目大意 长度为nnn的串&#xff0c;双回文串的定义是两个连续的回文串&#xff0c;求最长的双回文串。 解题思路 我们用马拉车维护pip_ipi​的时候维护一个lil_ili​和rir_iri​。 li:l_i:li​:以iii开头的最长回文串…

容器化分布式日志组件ExceptionLess的Angular前端UI

写在前面随着微服务架构的流行&#xff0c;日志也需要由专门的分布式日志组件来完成这个工作&#xff0c;我们项目使用的是 ExceptionLess 这个组件&#xff0c;它是前后端分离的&#xff1b;这篇文章我们就来实践容器化 ExceptionLess 的前端&#xff0c;并为其包含一个 nginx…

读人人都是产品经理__1

1、产品经理 设计产品的一大准则就是无需阅读说明书就能上手&#xff0c;如何让用户用起来更加省心是产品改进的方向&#xff0c;产品就是用来解决某个问题的东西&#xff0c;产品可以是有形的实物&#xff0c;也可以是无形的服务。只有能解决问题&#xff0c;产品才能有价值。…

【动态规划】最小代价问题

最小代价问题 Description 设有一个nm(小于100)的方格&#xff08;如图所示&#xff09;&#xff0c;在方格中去掉某些点&#xff0c;方格中的数字代表距离&#xff08;为小于100的数&#xff0c;如果为0表示去掉的点&#xff09;&#xff0c;试找出一条从A(左上角)到B&#…

jzoj3859-孤独一生【dp,树状数组】

正题 题目链接:https://jzoj.net/senior/#main/show/3859 题目大意 nnn个台阶&#xff0c;第iii个高度为hih_ihi​&#xff0c;把它分为两个集合&#xff0c;使得两个集合中相邻的hih_ihi​差值和最小。 解题思路 设fif_ifi​表示刚好处理到iii且目前集合开头是iii的最小差值…

EF 6.x、EF Core实现dynamic动态查询和EF Core实现多个上下文实例池你了解多少?

前言很长一段时间没有写博客了&#xff0c;今天补上一篇吧&#xff0c;偶尔发现不太愿意写博客了&#xff0c;太耗费时间&#xff0c;不过还是在坚持当中&#xff0c;毕竟或许写出来的东西能帮到一些童鞋吧&#xff0c;接下来我们直奔主题。无论是在在EF 6.x还是EF Core中对于原…

1、play编程基础

1、Action、Controller、Result Action指的是动作&#xff0c;play中大多数请求可以使用action来处理&#xff0c;一个请求对应一个动作也就是一个java方法&#xff0c;然后处理请求返回一个响应&#xff0c;这个响应用Result来体现 Controller就是一个继承了 play.mvc.Contro…

【动态规划】城市交通

城市交通 Description 有n个城市&#xff0c;编号1~n&#xff0c;有些城市之间有路相连&#xff0c;有些则没有&#xff0c;有路则当然有一个距离。现在规定只能从编号小的城市到编号大的城市&#xff0c;问你从编号为1的城市到编号为n的城市之间的最短距离是多少&#xff1f…

AspNetCoreApi 跨域处理(CORS )

如果咱们有处理过MV5 跨域问题这个问题也不大。&#xff08;1&#xff09;为什么会出现跨域问题&#xff1a;浏览器安全限制了前端脚本跨站点的访问资源&#xff0c;所以在调用WebApi 接口时不能成功访问资源&#xff0c;原因“同源策略”的存在&#xff1a;同源指以下几点相同…

【动态规划】求最长不下降序列

求最长不下降序列求最长不下降序列求最长不下降序列 Description 设有n(n<1000)个不相同的整数(小于32767)组成的数列&#xff0c;记为&#xff1a; a1,a2,…,an,其中任意两个数不相同。 例如&#xff1a;3,18,7,14,10,12,23,41,16,24。 若有 且有 。则称为长度为e的不…

jzoj3860-地壳运动(mst)【最小生成树,三分】

正题 题目链接:https://jzoj.net/senior/#contest/show/3002/1 题目大意 nnn个点mmm条边&#xff0c;每条边有(u,v)(u,v)(u,v)两个权值。 qqq个询问&#xff0c;每次询问一个(k1,k2)(k1,k2)(k1,k2)&#xff0c;将所有边的权值变为u∗k1v∗k2u*k1v*k2u∗k1v∗k2后求最小生成树。…

读人人都是产品经理__2

1、做产品和做项目 对产品经理来说&#xff0c;最重要的是判断力和创造力&#xff0c;产品经理决定做不做、做什么&#xff0c;保证方向正确&#xff0c;要把它实现。对项目经理来说&#xff0c;最终的是执行力和控制力&#xff0c;项目经理决定怎么做&#xff0c;谁来做&#…

业务配置开发平台qMISPlat 2.0 产品介绍

qMISPlat是什么qMISPlat(业务配置开发平台)是一套基于.net core 2.0、跨平台的&#xff0c;面向开发人员和具有一定技术水平的业务人员使用的业务配置开发平台。基于此平台您只需通过配置和少量开发即可快速搭建满足用户需求的业务系统&#xff0c;大大降低项目开发工作量。平台…

jzoj2755-[2012东莞市选]树的计数【dp,高精度】

正题 题目链接:https://jzoj.net/senior/#main/show/2755 题目大意 求有多少个nnn个点直径为ddd的标号树。 解题思路 定义fi,jf_{i,j}fi,j​表示iii个点&#xff0c;深度不超过jjj的标号树数量。 然后有转移fi,j∑k1i−1Ci−2k−1∗k∗fk,j−1∗fi−k,jf_{i,j}\sum_{k1}^{i…

2、异步HTTP编程

1、处理异步结果 在内部&#xff0c;play框架是自下而上异步的。Play以异步、非阻塞方式处理每个请求。应用程序代码应尽量避免阻塞控制器&#xff0c;这种阻塞操作的常见例子有JDBC调用、流式API、HTTP请求和长计算。因此应尽量通过保持控制器异步的方法使得应用进行扩展&…

【动态规划】最大子矩阵之和

最大子矩阵 Description 给出一个N [2<N<100]&#xff0c;并给出一个N*N的矩阵&#xff0c;矩阵中的数为[-127,127]之间。求出矩阵中一块子矩阵的最大和。 比如&#xff1a; 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 和最大的子矩阵应该是这个&#xff1a; 9 2 …