description

在遥远的未来,行星之间的食品运输将依靠单向的贸易路线。每条路径直接连接两个行星,且其运输时间是已知的。

贸易商协会打算利用一项最近发现的新技术——超空间旅行,以增加一些新的航线。通过超空间旅行的航线也是单向的。由于该项技术仍处于试验阶段,超空间旅行的时间目前是未知的,但它不取决于行星之间的距离,所以每个超空间旅行的路线将花费等量的时间。

下图是三个相互联通的行星及其运输时间的例子。行星使用正整数标号,超空间旅行时间记为“x”(图片对应第二个输入样例):

运输时间以天计,并且始终是一个正整数。

贸易商协会希望对引进新航线的结果进行分析:对于某两个行星A和B,他们想知道对于任意的x,从A到B的最短路径的总运输时间的所有可能的值。例如,在上述情况中,从星球2到星球1的最短路径所需时间可以取值5(如果x≥5),4,3,2,或1天(如果x<5)


analysis

  • 最短路\(+\)凸包

  • 对于一条路径,肯定是\(0x+b_0,x+b_1,2x+b_2\)这样的一次函数

  • 可以先跑最短路,\(f[i][j]\)表示到从\(S\)开始到第\(i\)位经过了\(j\)条\(x\)边的最小常数值

  • 若\(f[T]\)全为\(∞\),则无解;若\(f[T][0]\)为\(∞\),即没有一条确定值的路径,则有无数解

  • 跑完最短路,得到了一些一次函数,然后栈维护一个上凸壳

  • 若栈顶与当前函数交点的横坐标小于栈顶两个函数交点的横坐标,则该函数更优,不断出栈即可

  • 求出一个上凸壳后,函数两两交点之间的线段即为某函数的贡献值,计算求和

  • 注意算上常值函数的贡献

  • 本子\(OJ\)艹过去了,垃圾\(JZOJ\)对\(dij\)的优先队列极不友好所以\(T\)飞了

  • 感觉最近思维僵化,这个最短路模型和记几没有结合一起思考,还要再多巩固一下记几知识


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define MAXN 505
#define MAXM 20005
#define INF 1000000007
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define rep(i,a) for (reg i=last[a];i;i=next[i]) using namespace std; ll last[MAXM],next[MAXM],tov[MAXM],len[MAXM];
ll f[MAXN][MAXN];
ll n,m,q,tot,S,T;
bool bz[MAXN]; struct node
{
ll x,y,z;
friend bool operator<(node a,node b){return a.z>b.z;}
};
priority_queue<node>que;
struct line
{
double k,b;
line(){}
line(double kk,double bb){k=kk,b=bb;}
}stack[MAXN];
double cor[MAXN];
__attribute__((optimize("-O3")))
inline ll read()
{
ll x=0,f=1;char ch=getchar();
if (ch=='x')return 0;
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
__attribute__((optimize("-O3")))
inline void link(ll x,ll y,ll z)
{
next[++tot]=last[x],last[x]=tot,tov[tot]=y,len[tot]=z;
}
__attribute__((optimize("-O3")))
inline void dijkstra()
{
memset(f,64,sizeof(f));
que.push((node){S,0,0}),f[S][0]=0;
while (!que.empty())
{
node now=que.top();que.pop();
ll x=now.x,y=now.y,z=now.z;
if (z>f[x][y])continue;
rep(i,x)if (!len[i])
{
if (y==n)continue;
node tmp={tov[i],y+1,z};
if (f[x][y]<f[tov[i]][y+1])
{
f[tov[i]][y+1]=f[x][y];
que.push(tmp);
}
}
else
{
node tmp={tov[i],y,z+len[i]};
if (f[x][y]+len[i]<f[tov[i]][y])
{
f[tov[i]][y]=f[x][y]+len[i];
que.push(tmp);
}
}
}
}
__attribute__((optimize("-O3")))
inline double get(double k1,double b1,double k2,double b2)
{
return (b2-b1)/(k1-k2);
}
__attribute__((optimize("-O3")))
int main()
{
freopen("T3.in","r",stdin);
n=read(),m=read();
fo(i,1,m)
{
ll x=read(),y=read(),z=read();
link(x,y,z);
}
q=read();
while (q--)
{
S=read(),T=read(),dijkstra();bool flag=1;
fo(i,0,n)if (f[T][i]<INF){flag=0;break;}
if (flag){printf("0 0\n");continue;}
if (f[T][0]>INF){printf("inf\n");continue;}
ll top=0,sum=0;
fd(i,n,0)
{
if (f[T][i]==INF)continue;
while (top && get(stack[top].k,stack[top].b,i,f[T][i])<=cor[top])--top;
stack[++top]=line(i,f[T][i]);
if (top>1)cor[top]=get(stack[top-1].k,stack[top-1].b,stack[top].k,stack[top].b);
}
fo(i,1,top-1)
{
ll l=(ll)cor[i],r=(ll)cor[i+1];
if (l<r)sum+=(l+r+1)*(r-l)/2*stack[i].k+stack[i].b*(r-l);
}
ll num=(ll)cor[top];
if (cor[top]!=num || top==1)++num,sum+=f[T][0];
printf("%lld %lld\n",num,sum);
}
return 0;
}

【JZOJ3238】【BZOJ3482】超空间旅行的更多相关文章

  1. 【BZOJ 3482】 3482: [COCI2013]hiperprostor (dij+凸包)

    3482: [COCI2013]hiperprostor Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 277  Solved: 81 Descrip ...

  2. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  3. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

  4. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  5. codevs 1036 商务旅行(Targin求LCA)

    传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...

  6. nyoj 71 独木舟上的旅行(贪心专题)

    独木舟上的旅行 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...

  7. 【bzoj3531】 [SDOI2014]旅行

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

  8. tomcat源码分析(三)一次http请求的旅行-从Socket说起

    p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...

  9. 11.14 T2 小x的旅行(小x的旅行)

    1.小x的旅行   (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...

随机推荐

  1. var 更明确地表示一个变量被设置为零值

    创建一个变量并被初始化其为零值,习惯使用关键字var.这种做法是为了更明确地表示一个变量被设置为零值. 如果变量被初始化为某个非零值,就配合结构字面量和短变量操作符来创建变量. 零值 数值类型:0 字 ...

  2. 2. Vim 概念扫盲

    Frm: http://www.linuxidc.com/Linux/2013-05/84031p2.htm 了解Vim的三个基本模式 当我们安装完一个编辑器后,肯定会打开它,然后在里面输入点什么东西 ...

  3. Ehcache3.x学习(二)分层的选项

    Ehcache支持分层缓存的概念. 当想缓存堆内存以外的空间时,会发生下面的事情: 1.将数据添加到缓存意味着必须序列化key和value. 2.从缓存中读取数据意味着可能必须反序列化key和valu ...

  4. 【LGP5439】【XR-2】永恒

    题目 是个傻题 显然枚举每一条路径经过了多少次,如果\(u,v\)在树上不是祖先关系的话经过\((u,v)\)这条路径的路径条数就是\(sum_u\times sum_v\) 于是我们子树大小映射到\ ...

  5. 【POJ】1321棋盘问题

    题目链接:http://poj.org/problem?id=1321 题意:见题干,很清楚了. 题解:简单dfs,参照八皇后 代码: #include<iostream> #includ ...

  6. 【csp】2018-3

    第一题 跳一跳 题目: 题意:浅显.qwq 题解:2计数+1,到1就清空计数. 代码: #include<iostream> #include<cstdio> #include ...

  7. libgdx 启动者(个人翻译,还请不吝赐教)类和配置

    本文章翻译自libGDX官方wiki,.转载请注明出处:http://blog.csdn.net/kent_todo/article/details/37942047 libGDX官方网址:http: ...

  8. pandas中series求交集

    在进行数据探索的时候会遇到求交集的情况,比如说:优惠卷预测的时候,有多张表,表1有用户id,表2也有用户id,但是不能确定表1的用户有多少出现在表2当中. un_id1,un_id2 为两个 Seri ...

  9. 校园商铺-4店铺注册功能模块-1Dao层之更新店铺

    dao层增加更新店铺的方法 package com.csj2018.o2o.dao; import com.csj2018.o2o.entity.Shop; public interface Shop ...

  10. 0914CSP-S模拟测试赛后总结

    9-16 16:03-upd:T3数据出锅,老师重测了,于是更了榜单. 名次并没有变化,但是和大佬们的差距变大了. 还是自己实力不行啊.最起码T3不是特别难想吧. 继续努力吧. 粘个榜:%%%二营长. ...