zoukankan      html  css  js  c++  java
  • BZOJ4239 : 巴士走读

    考虑按时刻从早到晚模拟,计算出

    f[i]:到达i点的最晚出发时间

    g[i]:为了赶上第i辆车的最晚出发时间

    然后将所有到达n号点的巴士按到达时间排序,查询的时候二分查找即可。

    时间复杂度$O(nlog n)$。

    #include<cstdio>
    #include<vector>
    #include<algorithm>
    #include<queue>
    #define N 300010
    #define X first
    #define Y second
    using namespace std;
    typedef pair<int,int> P;
    int n,m,i,x,f[N],g[N],cnt;P t,h[N];
    priority_queue<P,vector<P>,greater<P> >Q;
    struct E{int a,b,x,y;}e[N];
    inline bool cmp(const E&a,const E&b){return a.x<b.x;}
    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 int ask(){
      int l=1,r=cnt,mid,t=0;
      while(l<=r)if(h[mid=(l+r)>>1].X<=x)l=(t=mid)+1;else r=mid-1;
      return h[t].Y;
    }
    int main(){
      for(read(n),read(m),i=1;i<=m;i++)read(e[i].a),read(e[i].b),read(e[i].x),read(e[i].y);
      for(f[1]=86400000,i=2;i<=n;i++)f[i]=-1;
      for(sort(e+1,e+m+1,cmp),i=1;i<=m;i++){
        while(!Q.empty()&&Q.top().X<=e[i].x)t=Q.top(),Q.pop(),f[e[t.Y].b]=max(f[e[t.Y].b],g[t.Y]);
        g[i]=min(f[e[i].a],e[i].x),Q.push(P(e[i].y,i));
        if(e[i].b==n)h[++cnt]=P(e[i].y,g[i]);
      }
      for(h[0]=P(-1,-1),sort(h+1,h+cnt+1),i=2;i<=cnt;i++)h[i].Y=max(h[i].Y,h[i-1].Y);
      for(read(m);m--;printf("%d
    ",ask()))read(x);
      return 0;
    }
    

      

  • 相关阅读:
    jmeter学习笔记(十一)定时器
    jmter学习笔记(十)断言
    jmeter学习笔记(九)
    jmeter学习笔记(八-1)
    jmeter学习笔记(八-2)
    jmeter上传发送文件学习笔记
    jmeter学习笔记(七)
    jmeter学习笔记(六)
    jmeter学习笔记(四)
    jmeter学习笔记(五)
  • 原文地址:https://www.cnblogs.com/clrs97/p/4740651.html
Copyright © 2011-2022 走看看