把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

luogu P3573 [POI2014]RAJ-Rally

题面传送门
太神了。这道题。
考虑先两次拓扑找到\(d1\)为起点到这个点的最长路,\(d2\)为这个点开始的最长路。
然后按照拓扑序操作点。
如果我们将操作过的点设为\(A\)集合,没有操作过的点设为\(B\)集合,那么最长路只可能是以下三种:
A集合内部,B集合内部,A集合到B集合。
前面两个很好维护,第三个在加点和删点的时候维护一下就好了。时间复杂度\(O(nlogn)\)
code:

#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define re register
#define ll long long
#define db double
#define lb long db
#define N 1000000
#define K 20
#define mod 998244353
#define Mod 998244352
#define eps (1e-4)
#define U unsigned int
#define it iterator
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define d(x,y) (n*(x-1)+(y))
using namespace std;
int n,m,F1[N+5],F2[N+5],in[N+5],x[N+5],y[N+5],now,F[N+5],Fh,Ans=1e9,Id;multiset<int> G;multiset<int>::it tot;
struct yyy{int to,z;}tmp;queue<int>Q;
struct ljb{int head,h[N+5];yyy f[N+5];I void add(int x,int y){f[++head]=(yyy){y,h[x]};h[x]=head;}}S1,S2;
I void earse(int x){tot=G.lower_bound(x);G.erase(tot);}
int main(){
	freopen("guard.in","r",stdin);//freopen("guard.out","w",stdout);
	re int i,j;scanf("%d%d",&n,&m);for(i=1;i<=m;i++) scanf("%d%d",&x[i],&y[i]),in[y[i]]++,S1.add(x[i],y[i]),S2.add(y[i],x[i]);for(i=1;i<=n;i++)!in[i]&&(Q.push(i),0);while(!Q.empty()){
		now=Q.front();F[++Fh]=now;Q.pop();for(i=S1.h[now];i;i=tmp.z) tmp=S1.f[i],in[tmp.to]--,!in[tmp.to]&&(Q.push(tmp.to),F1[tmp.to]=F1[now]+1);
	}for(i=1;i<=m;i++) in[x[i]]++;for(i=1;i<=n;i++) !in[i]&&(Q.push(i),0);while(!Q.empty()){
		now=Q.front();Q.pop();for(i=S2.h[now];i;i=tmp.z) tmp=S2.f[i],in[tmp.to]--,!in[tmp.to]&&(Q.push(tmp.to),F2[tmp.to]=F2[now]+1);
	}for(i=1;i<=n;i++)G.insert(F2[i]);for(i=1;i<=n;i++) {
		now=F[i];earse(F2[now]);for(j=S2.h[now];j;j=tmp.z)tmp=S2.f[j],earse(F2[now]+1+F1[tmp.to]);tot=G.end();tot--;Ans>=*tot&&(Ans^*tot?(Ans=*tot,Id=now):(Id=min(Id,now)));
		G.insert(F1[now]);for(j=S1.h[now];j;j=tmp.z) tmp=S1.f[j],G.insert(F1[now]+1+F2[tmp.to]);
	}printf("%d %d\n",Id,Ans);
}
posted @ 2021-08-15 14:49  275307894a  阅读(35)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end