zoukankan      html  css  js  c++  java
  • BZOJ1395 : [Baltic2005]Trip

    建立新图,原图中每条边在新图中是点,新图中每个点的点权为$-e[i].c+e[i].b$,边权为$0$。

    若$e[i].dleq e[j].a$,则连一条$i$到$j$的单向边。

    对于原图中每个点,将所有入边和出边分别排序,然后建立一排虚点表示后缀,通过双指针将边数优化至$O(m)$。

    在新图中求出最短路,最后将答案加上$T$即可。

    注意到新图是个DAG,因此可以记搜求解。

    时间复杂度$O(mlog m)$。

    #include<cstdio>
    #include<algorithm>
    const int N=50010,M=100010;
    int n,m,cnt,P,T,i,j,k,gi[N],go[N],g[M*2],v[M*5],nxt[M*5],ed,a[M],b[M],ca,cb,vis[M*2],f[M*2],ans;
    struct E{int x,y,a,b,c,d;}e[M];
    inline bool cmpa(int x,int y){return e[x].d<e[y].d;}
    inline bool cmpb(int x,int y){return e[x].a<e[y].a;}
    inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
    inline void add(int*g,int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
    inline void up(int&x,int y){if(x>y)x=y;}
    int dp(int x){
      if(vis[x])return f[x];
      vis[x]=1;
      int&t=f[x];
      t=1;
      if(x<=m)if(e[x].x==1)t=0;
      for(int i=g[x];i;i=nxt[i])up(t,dp(v[i]));
      if(t<1&&x<=m)t+=e[x].b-e[x].c;
      return t;
    }
    int main(){
      read(n),read(m),read(P),read(T);
      for(i=1;i<=m;i++){
        read(e[i].x),read(e[i].y),read(e[i].a),read(e[i].b),read(e[i].c),read(e[i].d);
        add(go,e[i].x,i);
        add(gi,e[i].y,i);
      }
      cnt=m;
      for(i=1;i<=n;i++){
        for(ca=0,j=gi[i];j;j=nxt[j])a[++ca]=v[j];
        if(!ca)continue;
        for(cb=0,j=go[i];j;j=nxt[j])b[++cb]=v[j];
        if(!cb)continue;
        std::sort(a+1,a+ca+1,cmpa);
        std::sort(b+1,b+cb+1,cmpb);
        for(j=1;j<=cb;j++){
          if(j<cb)add(g,cnt+j+1,cnt+j);
          add(g,b[j],cnt+j);
        }
        for(j=ca,k=cb+1;j;j--){
          while(k>1&&e[a[j]].d<=e[b[k-1]].a)k--;
          if(k<=cb)add(g,cnt+k,a[j]);
        }
        cnt+=cb;
      }
      if(P!=1)ans=1;
      for(i=1;i<=m;i++)if(e[i].y==P&&e[i].d<=T){
        dp(i);
        if(f[i]<1)up(ans,f[i]);
      }
      if(ans>0)ans=-1;else ans+=T;
      return printf("%d",ans),0;
    }
    

      

  • 相关阅读:
    PHP filter_var() 函数
    jquery 表格(点击列标题,保留当前列,其他列隐藏)
    jquery 表格(表格记录分页显示)
    jquery 表格(点击行或列,隐藏当前选中的行或列)
    jquery 表格(鼠标悬停改变改变行背景+隔行换色)
    jquery 表格(鼠标悬停列标题,改变该列的背景色)
    你不了解的PHP 的10件事情(转)
    优化PHP代码的40条建议(转)
    jquery 表格(展开和折叠列表项)
    IDENT_CURRENT
  • 原文地址:https://www.cnblogs.com/clrs97/p/6358172.html
Copyright © 2011-2022 走看看