BZOJ4053 : [Cerc2013]Subway
通过BFS可以求出到每个站点的最小花费。
每次从队首取出一个点,枚举所有它能花费1块钱就到达的线路,通过两遍递推求出最大时间。
注意到每个点和每条线路只有第一次使用时有用,所以总时间复杂度为$O(n+m)$。
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef unsigned long long ll;
const int N=300010,M=100010,E=1000010,inf=1000000000;
int Case,n,m,i,j,k,l,D,S,T,a[E],cnt,st[M],en[M],g[N],v[E],nxt[E],ed;
int q[N],h,t,d[N],f[N];bool vis[N],use[M];
char s[18000000],sS[55],sT[55];ll b[N];
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline bool check(char x){
if(x>='a'&&x<='z')return 1;
if(x>='A'&&x<='Z')return 1;
if(x>='0'&&x<='9')return 1;
return x=='-'||x=='\''||x=='&';
}
inline ll gethash(int l,int r){
ll t=0;
for(int i=l;i<r;i++)t=t*233+s[i];
return t;
}
inline ll getname(char*s){
scanf("%s",s);
int l=strlen(s);ll t=0;
for(int i=0;i<l;i++)t=t*233+s[i];
return t;
}
inline int ask(ll x){
int l=1,r=n,mid;
while(1){
if(b[mid=(l+r)>>1]==x)return mid;
if(b[mid]<x)l=mid+1;else r=mid-1;
}
}
inline void up(int&x,int y){if(x<y)x=y;}
inline void solve(int x){
if(use[x])return;
use[x]=1;
int i,tmp;
for(i=st[x];i<=en[x];i++)if(!vis[a[i]])vis[q[++t]=a[i]]=1,d[a[i]]=D+1;
for(tmp=-inf,i=st[x];i<=en[x];i++)if(d[a[i]]==D)up(tmp,f[a[i]]-i);else up(f[a[i]],tmp+i);
for(tmp=-inf,i=en[x];i>=st[x];i--)if(d[a[i]]==D)up(tmp,f[a[i]]+i);else up(f[a[i]],tmp-i);
}
int main(){
scanf("%d",&Case);
while(Case--){
scanf("%s",s);
gets(s);
l=strlen(s);
for(n=i=0;i<l;)if(!check(s[i]))i++;else{
for(j=i;j<l&&check(s[j]);j++);
b[++n]=gethash(i,j);
i=j;
}
std::sort(b+1,b+n+1);
for(ed=0,i=1;i<=n;i++)g[i]=0;
scanf("%s",s);
gets(s);
l=strlen(s);
for(m=i=0;i<l;)if(!check(s[i]))i++;else{
for(j=i;j<l&&check(s[j]);j++);
m++;
i=j;
}
for(cnt=0,k=1;k<=m;k++){
scanf("%s",s);
scanf("%s",s);
gets(s);
l=strlen(s);
st[k]=cnt+1;
for(i=0;i<l;)if(!check(s[i]))i++;else{
for(j=i;j<l&&check(s[j]);j++);
a[++cnt]=ask(gethash(i,j));
i=j;
}
en[k]=cnt;
for(j=st[k];j<=en[k];j++)add(a[j],k);
use[k]=0;
}
scanf("%s",s);
scanf("%s",s);
scanf("%s",s);
S=ask(getname(sS));
scanf("%s",s);
scanf("%s",s);
scanf("%s",s);
T=ask(getname(sT));
for(i=1;i<=n;i++)d[i]=inf,f[i]=vis[i]=0;
d[S]=f[S]=0;
vis[S]=1;
q[h=t=1]=S;
while(h<=t){
D=d[q[h]];
while(h<=t&&d[q[h]]==D)for(i=g[q[h++]];i;i=nxt[i])solve(v[i]);
}
printf("optimal travel from %s to %s: %d line",sS,sT,d[T]);
if(d[T]>1)putchar('s');
printf(", %d minute",f[T]);
if(f[T]>1)putchar('s');
puts("");
}
return 0;
}
BZOJ4053 : [Cerc2013]Subway的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 第一次作业——subway
作业源程序代码:https://github.com/R-81/subway 作业程序使用说明:通过输入命令参数求解路线(仅支持-b,-c),根据参数得出路线后,程序不会结束,此时可输入地铁路线名(例 ...
- 2016 Multi-University Training Contest 1 J.Subway
Subway Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Su ...
- Subway Icon Set – 306个像素完美的特制图标
这个图标集是306个优化的像素完美,精雕细琢的图标.为这些设备进行了优化:iOS.Windows Phone.Windows 8 and BlackBerry 10,提供 PNG, SVG, XALM ...
- ural 1272. Non-Yekaterinburg Subway
1272. Non-Yekaterinburg Subway Time limit: 1.0 secondMemory limit: 64 MB A little town started to co ...
- URAL(timus) 1272 Non-Yekaterinburg Subway(最小生成树)
Non-Yekaterinburg Subway Time limit: 1.0 secondMemory limit: 64 MB A little town started to construc ...
- 【POJ】【1635】Subway Tree Systems
树的最小表示法 给定两个有根树的dfs序,问这两棵树是否同构 题解:http://blog.sina.com.cn/s/blog_a4c6b95201017tlz.html 题目要求判断两棵树是否是同 ...
- POJ 2502 Subway (最短路)
Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ...
- POJ 2502 Subway
Subway Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4928 Accepted: 1602 Descriptio ...
随机推荐
- Android网络通信(8):WiFi Direct
Android网络通信之WiFi Direct 使用Wi-Fi Direct技术可以让具备硬件支持的设备在没有中间接入点的情况下进行直接互联.Android 4.0(API版本14)及以后的系统都提供 ...
- 100以内的质数(for和if)
- 来自工程师的8项Web性能提升建议
在互联网盛行的今天,越来越多的在线用户希望得到安全可靠并且快速的访问体验.针对Web网页过于膨胀以及第三脚本蚕食流量等问题,Radware向网站运营人员提出以下改进建议,帮助他们为用户提供最快最优质的 ...
- wap页面缩放
html{font-size: 100%;}.in-main{ min-width:320px; max-width:640px; margin:0 auto; font-size:14px; bac ...
- python之比较is与==(转载)
在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同.莱布尼茨说过: ...
- 深度学习Bible学习笔记:第六章 深度前馈网络
第四章 数值计算(numerical calculation)和第五章 机器学习基础下去自己看. 一.深度前馈网络(Deep Feedfarward Network,DFN)概要: DFN:深度前馈网 ...
- 并发研究之Java内存模型(Java Memory Model)
Java内存模型JMM java内存模型定义 上一遍文章我们讲到了CPU缓存一致性以及内存屏障问题.那么Java作为一个跨平台的语言,它的实现要面对不同的底层硬件系统,设计一个中间层模型来屏蔽底层的硬 ...
- JavaScript中的短路
短路:逻辑运算从左到右.逻辑或运算,当左边的条件成立时,后面的条件将不再参与运算. 因此在逻辑或运算中,尽量将条件结果为true的放第一位.而在逻辑与运算中,尽量将条件结果为false的放到第一位. ...
- tomcat常用的配置
这里我们使用tomcat版本:apache-tomcat-7.0.77-windows-x64.zip 为例:下载链接地址为:https://archive.apache.org/dist/tomca ...
- P3331 [ZJOI2011]礼物(GIFT)
题解: 首先转化为平面问题 对于每一个z,f(x,y)的值为它能向上延伸的最大高度 ...莫名其妙想出来的是n^4 以每个点作为右下边界n^3枚举再o(n)枚举左下边界计算z的最大值 然而很显然这种做 ...