BZOJ4239 : 巴士走读
2015-08-18 21:13
351 查看
考虑按时刻从早到晚模拟,计算出
f[i]:到达i点的最晚出发时间
g[i]:为了赶上第i辆车的最晚出发时间
然后将所有到达n号点的巴士按到达时间排序,查询的时候二分查找即可。
时间复杂度$O(n\log n)$。
f[i]:到达i点的最晚出发时间
g[i]:为了赶上第i辆车的最晚出发时间
然后将所有到达n号点的巴士按到达时间排序,查询的时候二分查找即可。
时间复杂度$O(n\log 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 ,g ,cnt;P t,h ; priority_queue<P,vector<P>,greater<P> >Q; struct E{int a,b,x,y;}e ; 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\n",ask()))read(x); return 0; }
相关文章推荐
- 黑马程序员----异常处理机制的概括
- Vsftpd服务搭建
- andriod-javamail 实现发送邮件
- Java基础50问与答
- Android 笔记1
- POJ2528 Mayor's posters
- ubuntu开机屏幕发暗,设置开机自启动设置亮度
- 试题系列一(求4,5,6,7所有四位数的排列组合)
- 美团面试
- Centos6.6 zabbix 安装和配置
- Android之HttpClient的使用方法
- 单链表的整表创建和删除(四)
- uva 1175 Ladies' Choice (稳定婚姻问题)
- 差分约束系统详解
- Eddy's digital Roots HDU杭电1163 【一个比较实用的定理】
- 如何有效地记忆与学习
- shell 两个rpm包做差分
- 精品软件 推荐 Office 文档专用压缩工具 - NXPowerLite 6.0.5 中文便携版
- 精品软件 推荐 Office 文档专用压缩工具 - NXPowerLite 6.0.5 中文便携版
- HTTP协议总结