3482: [COCI2013]hiperprostor

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 277  Solved: 81

Description

在遥远的未来,行星之间的食品运输将依靠单向的贸易路线。每条路径直接连接两个行星,且其运输时间是已知的
。贸易商协会打算利用一项最近发现的新技术——超空间旅行,以增加一些新的航线。通过超空间旅行的航线也是
单向的。由于该项技术仍处于试验阶段,超空间旅行的时间目前是未知的,但它不取决于行星之间的距离,所以每
个超空间旅行的路线将花费等量的时间。下图是三个相互联通的行星及其运输时间的例子。行星使用正整数标号,
超空间旅行时间记为“x”(图片对应第输入样例):过境的时间以天计,并且始终是一个正整数。贸易商协会希
望对引进新航线的后果进行分析:对于某两个行星A和B,他们想知道对于任意的x,从A到B的最短路径的总中转时
间的所有可能的值。例如,在上述情况中,从星球2到星球1的最短路径所需时间可以取值5(如果x≥5),4,3,2
,或1天(如果x<5)

Input

输入的第一行包含两个整数P和R,分别代表行星的数目和航线数量,1≤P≤500,0≤R≤10000。接下来的R条航线
路径包含两或三个整数:行星标号C和D(1≤C,D≤P,C≠D),和T,从C到D的旅行时间。对于传统的路径,T是一
个整数(1≤T≤1000000),超空间航线中,T是字符“x”。 可以存在多行有两个相同的行星。下面的行中包含的
整数Q(1≤Q≤10),表示查询的数量。以下Q行包含两个整数星球标号(A和B,A≠B),为贸易商协会的查询:“
从A到B的最短路径时间的可能值是什么?

Output

输出必须包含q行,每行??一个查询。每一行都必须包含两个整数:不同的可能值的数目和它们的总和。如果不同
的可能值的数目是无限的,该行只输出“inf”。如果没有从A到B的路径,不同的可能值的数目及它们的总和都是0

Sample Input

4 4
1 2 x
2 3 x
3 4 x
1 4 8
3
2 1
1 3
1 4

Sample Output

0 0
inf
3 17

HINT

2016.6.15新加数据一组,未重测

Source

【分析】

  f[i][j]表示走到i,走了j条x边,最短路。【好像spfa会被卡,我就打了dij

  【dij的比较没有打return 调了半天哭死。。。

  若f[i][j]全是INF 就是无解

  若f[i][0]是INF 就是无穷解

  然后其他的,得到i,f[i][ed],写成直线y=i*x+f[i][ed],维护一个凸包。

  他们中间点的个数和值是等差数列,直接求和。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 510
#define Maxm 10010
#define LL long long
#define INF 0x7fffffff int n,m; int read()
{
char ch;
while(!(((ch=getchar())>=''&&ch<='')||(ch=='x')));
if(ch=='x') return ;
int x=ch-'';
while(((ch=getchar())>='')&&(ch<='')) x=x*+ch-'';
return x;
} struct node
{
int x,y,next,c;
}t[Maxm*];
int len,first[Maxn]; void ins(int x,int y,int c)
{
t[++len].x=x;t[len].y=y;t[len].c=c;
t[len].next=first[x];first[x]=len;
} struct hp
{
int x,y,dis;
friend bool operator < (hp x,hp y)
{
return x.dis>y.dis;
}
}; int f[Maxn][Maxn];
priority_queue<hp> q;
void dij(int st)
{
hp nw;nw.dis=;nw.x=st;nw.y=;
q.push(nw);f[st][]=;
while(!q.empty())
{
nw=q.top();q.pop();
if(nw.dis>f[nw.x][nw.y]) continue;
int x=nw.x;
hp now;
for(int i=first[x];i;i=t[i].next)
{
int y=t[i].y;
if(t[i].c==)
{
if(nw.y==n) continue;
now.x=y;now.y=nw.y+;now.dis=nw.dis;
if(f[now.x][now.y]>f[nw.x][nw.y])
{
f[now.x][now.y]=f[nw.x][nw.y];
q.push(now);
}
}
else
{
now.x=y;now.y=nw.y;now.dis=f[nw.x][nw.y]+t[i].c;
if(f[now.x][now.y]>f[nw.x][nw.y]+t[i].c)
{
f[now.x][now.y]=f[nw.x][nw.y]+t[i].c;
q.push(now);
}
}
}
}
}
struct Line
{
double k,b;
Line() {}
Line(double nk,double nb) {k=nk;b=nb;}
}P[Maxn];int sl;double tt[Maxn]; double pt(double k1,double b1,double k2,double b2)
{
return (b2-b1)/(k1-k2);
} void get_ans()
{
int q=read();int cnt=;
while(q--)
{
int st=read(),ed=read();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) {f[i][j]=INF;}
dij(st);
bool pp=;
for(int i=;i<=n;i++) if(f[ed][i]!=INF) {pp=;break;}
if(!pp) {printf("0 0\n");continue;}
if(f[ed][]==INF) {printf("inf\n");continue;}
int num=;
LL sum=;sl=;
for(int i=n;i>=;i--)
{
if(f[ed][i]==INF) continue;
while(sl>=&&pt(P[sl].k,P[sl].b,i,f[ed][i])<=tt[sl]) sl--;
P[++sl]=Line(i,f[ed][i]);
if(sl>) tt[sl]=pt(P[sl-].k,P[sl-].b,P[sl].k,P[sl].b);
}
for(int i=;i<=sl-;i++)
{
int l=(int)tt[i]+,r=(int)tt[i+];
if(l<=r) sum+=(LL)(l*P[i].k+P[i].b+r*P[i].k+P[i].b)*(r-l+)/;
}
num=(int)tt[sl];
if(tt[sl]!=num||sl==) num++,sum+=f[ed][];
printf("%d %lld\n",num,sum);
}
} int main()
{
n=read();m=read();
len=;
memset(first,,sizeof(first));
for(int i=;i<=m;i++)
{
int x,y,c;
x=read();y=read();c=read();
ins(x,y,c);
}
get_ans();
return ;
}

【凸包和dij都好弱啊,膜了一下某大神代码。。】

2017-03-31 08:17:57

【BZOJ 3482】 3482: [COCI2013]hiperprostor (dij+凸包)的更多相关文章

  1. bzoj 1185 [HNOI2007]最小矩形覆盖 凸包+旋转卡壳

    题目大意 用最小矩形覆盖平面上所有的点 分析 有一结论:最小矩形中有一条边在凸包的边上,不然可以旋转一个角度让面积变小 简略证明 我们逆时针枚举一条边 用旋转卡壳维护此时最左,最右,最上的点 注意 注 ...

  2. BZOJ 1069 Luogu P4166 最大土地面积 (凸包)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=1069 (luogu)https://www.luogu.org/probl ...

  3. 【BZOJ】1027: [JSOI2007]合金(凸包+floyd)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1027 题意:$n$种材料,$m$种需求.每种材料有三个属性,给出三个属性的含量(和为1),问能否通过 ...

  4. bzoj 1209: [HNOI2004]最佳包裹 三维凸包

    1209: [HNOI2004]最佳包裹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 160  Solved: 58[Submit][Status] ...

  5. BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )

    离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...

  6. BZOJ [HAOI2011]防线修建(动态凸包)

    听说有一种很高端的东西叫动态凸包维护dp就像学一下,不过介于本人还不会动态凸包就去学了下,还是挺神奇的说,维护上下凸包的写法虽然打得有点多不过也只是维护复制黏贴的事情而已罢了. 先说下动态凸包怎么写吧 ...

  7. BZOJ 3203 [SDOI2013]保护出题人 (凸包+三分)

    洛谷传送门 题目大意:太长略 每新加入一个僵尸,容易得到方程$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s_{i}+d(i-j)}}$ 即从头开始每一段僵尸都需要在规定距 ...

  8. BZOJ3482 : [COCI2013]hiperprostor

    对于每组询问,spfa求出f[i][j]表示从S出发,经过j条x边到达i的最短路. 若f[T][i]都为inf,则无解. 若f[T][0]为inf,则有无穷个解. 否则可以看作若干条直线,$O(n)$ ...

  9. bzoj 3203: [Sdoi2013]保护出题人 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3203 题解 首先我们考虑对一大波僵尸来袭的情况进行分析 假设来袭的僵尸是\(\{ a_1 ...

随机推荐

  1. C# 遍历枚举

    C#中,如何获取(遍历)枚举中所有的值: public enum Suits { Spades, Hearts, Clubs, Diamonds, NumSuits } private static ...

  2. MagicB.0—怎样设置电脑自动关机?

    天太晚了,该睡觉了,可是你的东西也许正在下载,软件正在更新,总之电脑还有一些工作没有完成,又不需要你人为的守着,随他去吧!可是电脑已经工作了一天了,它也要休息一下,再者也不能浪费电力资源呀,那么就来使 ...

  3. Mock InjectMocks ( @Mock 和 @InjectMocks )区别

    之前一直对这两个注解的区别不是很明白. 搜到过一篇博客园的文章举例说明了代码行为的区别.后来在stackoverflow上看到一个问答简单明了的解释了这两个注解在定义上的区别: 在此翻译记录一下: / ...

  4. HDU 1521 排列组合 (母函数)

    题目链接 Problem Description 有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB&qu ...

  5. 项目记录 -- config2html 理解

    html 代码: <table width=1280 border=0 cellspacing=1 cellpadding=1> <tr id=tblhdr> <td&g ...

  6. AspNet Core 发布到Linux系统和发布IIS 注意项

    AspNet Core 发布到Linux系统和发布IIS 注意项 1.发布时需要注意的 2.Windows Server 2012 api-ms-win-crt-runtime-l1-1-0.dll ...

  7. Unity 软件使用事项

    打开旧版工程 目前发现两种方式来触发升级程序: 1.Unity软件启动时选择旧版工程,触发更新 2.直接打开旧版工程的场景文件,触发更新   在使用中发现一种错误做法,不知道是不是共性问题,在此先记录 ...

  8. Hadoop(七)YARN的资源调度

    一.YARN 概述 YARN 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操 作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序 YARN ...

  9. 面试题32:从1到n整数中1出现的次数

    这是一道广为流传的google面试题.用最直观的方法求解并不是很难,但遗憾的是效率不是很高:而要得出一个效率较高的算法,需要比较强的分析能力,并不是件很容易的事情.当然,google的面试题中简单的也 ...

  10. [实战]MVC5+EF6+MySql企业网盘实战(11)——新建文件夹2

    写在前面 上篇文章实现了创建文件夹的功能,这里面将实现单击文件夹,加载列表的功能. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网 ...