【bzoj 3832】: [Poi2014]Rally

来源:互联网 发布:sql数据库语法 编辑:程序博客网 时间:2024/04/29 03:10

http://www.lydsy.com/JudgeOnline/problem.php?id=3832


神一样的题&神一样的做法!


#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <cmath>#include <algorithm>#include <set>using namespace std;#define rep(i,l,r) for(int i=(l),_=(r);i<=_;i++)#define per(i,r,l) for(int i=(r),_=(l);i>=_;i--)#define MS(arr,x) memset(arr,x,sizeof(arr))#define INE(i,u,head) for(int i=head[u];~i;i=e[i].next)#define LL long longinline const int read(){int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}////////////////////////////////////////////////const int N=500010;const int M=1000010;int n,m;struct edge{int v,next;}e[M*2];int head[2][N],k;multiset<int>S;int ind[N];int q[N],l,r;int dis[2][N];////////////////////////////////////////////////void adde(int u,int v,int t){e[k]=(edge){v,head[t][u]};head[t][u]=k++;}inline void MAX(int &a,int b){if(a<b)a=b;}////////////////////////////////////////////////void input(){MS(head,-1);    n=read(); m=read();    rep(i,1,m)    {    int u=read(),v=read(); ind[v]++;    adde(u,v,0); adde(v,u,1);    }}void solve(){int pos=0,mi=n,tmp;int SS=n+1,TT=n+2;rep(i,1,n) if(ind[i] == 0) q[r++]=i;while(l<r) INE(i,q[l++],head[0]) if(!--ind[e[i].v]) q[r++]=e[i].v;rep(t,0,n-1) INE(i,q[t],head[0]) MAX(dis[0][e[i].v],dis[0][q[t]]+1);per(t,n-1,0) INE(i,q[t],head[1]) MAX(dis[1][e[i].v],dis[1][q[t]]+1);rep(i,1,n) S.insert(dis[1][i]);rep(t,0,n-1){S.erase(S.find(dis[1][q[t]]));INE(i,q[t],head[1]) S.erase(S.find(dis[0][e[i].v]+dis[1][q[t]]+1));tmp=*S.rbegin();if(tmp < mi) mi=tmp,pos=q[t];INE(i,q[t],head[0]) S.insert(dis[0][q[t]]+dis[1][e[i].v]+1);S.insert(dis[0][q[t]]);}printf("%d %d\n",pos,mi);}////////////////////////////////////////////////int main(){    freopen("_.in","r",stdin); freopen("_.out","w",stdout);    input(),solve();    return 0;}


0 0
原创粉丝点击