BZOJ3482 : [COCI2013]hiperprostor
对于每组询问,spfa求出f[i][j]表示从S出发,经过j条x边到达i的最短路。
若f[T][i]都为inf,则无解。
若f[T][0]为inf,则有无穷个解。
否则可以看作若干条直线,$O(n)$求出凸壳。
算出相邻两条直线交点横坐标并取下整,若刚好为整数则-1,设b[i]为i与i+1的交点的横坐标。
则第i(1<=i<t)段的贡献为首项为f(b[i-1]+1),末项为f(b[i])的等差数列。
最后一段的斜率为0,所以贡献为f[T][0]。
#include<cstdio>
typedef long long ll;
const int N=510,M=10010,inf=~0U>>1;
int n,m,i,j,x,y,z,S,T,g[N],v[M],w[M],nxt[M],ed,f[N][N],in[N][N],q[1000000][2];
int h,t,a[N],b[N],cnt;ll sum;
inline void read(int&a){
char c;
while(!((((c=getchar())>='0')&&(c<='9'))||(c=='x')));
if(c=='x'){a=0;return;}
a=c-'0';
while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';
}
inline void addedge(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}
inline void add(int x,int y,int z){
if(y>=n)return;
if(f[x][y]<=z)return;
f[x][y]=z;
if(!in[x][y])in[x][y]=1,q[++t][0]=x,q[t][1]=y;
}
inline double cross(int x,int y){return (double)(f[T][x]-f[T][y])/(double)(y-x);}
inline int crossi(int x,int y){
int a=f[T][y]-f[T][x],b=x-y;
if(a<=0)return 0;
return(a-1)/b;
}
inline void cal(int k,int b,int l,int r){
if(l<1)l=1;
if(l>r)return;
cnt+=r-l+1;
sum+=((ll)(l+r)*k+2LL*b)*(r-l+1)/2;
}
int main(){
read(n),read(m);
while(m--)read(x),read(y),read(z),addedge(x,y,z);
read(m);
while(m--){
read(S),read(T);
for(i=1;i<=n;i++)for(j=0;j<n;j++)f[i][j]=inf;
h=1,t=0,add(S,0,0);
while(h<=t){
x=q[h][0],y=q[h++][1],in[x][y]=0;
for(i=g[x];i;i=nxt[i])add(v[i],y+(w[i]==0),f[x][y]+w[i]);
}
for(j=0;j<n;j++)if(f[T][j]<inf)break;
if(j==n){puts("0 0");continue;}
if(f[T][0]==inf){puts("inf");continue;}
for(t=0,i=n-1;~i;i--)if(f[T][i]<inf){
while(t>1&&cross(a[t-1],a[t])>=cross(a[t],i))t--;
a[++t]=i;
}
cnt=1,sum=f[T][0];
for(i=1;i<t;i++)cal(a[i],f[T][a[i]],b[i-1]+1,b[i]=crossi(a[i],a[i+1]));
printf("%d %lld\n",cnt,sum);
}
return 0;
}
BZOJ3482 : [COCI2013]hiperprostor的更多相关文章
- 【BZOJ 3482】 3482: [COCI2013]hiperprostor (dij+凸包)
3482: [COCI2013]hiperprostor Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 277 Solved: 81 Descrip ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [COCI2013]DLAKAVAC
[COCI2013]DLAKAVAC 题目大意: 有一个长度为\(m(m\le1500)\)的\(01\)串\(A\),进行\(k(k\le10^{18})\)次操作.一次操作完的串中若\(A_i=1 ...
- 【JZOJ3238】【BZOJ3482】超空间旅行
description 在遥远的未来,行星之间的食品运输将依靠单向的贸易路线.每条路径直接连接两个行星,且其运输时间是已知的. 贸易商协会打算利用一项最近发现的新技术--超空间旅行,以增加一些新的航线 ...
随机推荐
- node.js+websocket实现简易聊天室
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...
- MFC 最大化 的时候控件 按比例变大
在dlg类头文件中声明CPoint Old; 在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()声明一个映射:ON_WM_SIZE() 这样以后就可以在M_SIZE事件的时候 ...
- java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间
java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类). java.sql.Date是java.util.Da ...
- FastMM的安装方法
FastMM 快速在D2006和2007中已代替了原来的内存管理器.D7也可以使用,而且很方便哦.请看步骤: 1. FastMM是开源项目,去她老家先拖个来. http://sourceforge.n ...
- Shell脚本中cd命令使用
在写shell脚本的时候发现cd切换目录的时候无法切换,代码是下面的. #!/bin/bash #changedir.sh history cd /home/firefox sleep pwd 我仔细 ...
- Java常用排序算法+程序员必须掌握的8大排序算法
概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...
- 安装完mysql后用root不能su成mysql
现象: debian的机器用aptitude install mysql-server-5.1 后,用id mysql 可看出已经建了mysql用户,但是用root来su mysql 不成功,/var ...
- CAS单点登录之mysql数据库用户验证及常见问题
前面已经介绍了CAS服务器的搭建,详情见:搭建CAS单点登录服务器.然而前面只是简单地介绍了服务器的搭建,其验证方式是原始的配置文件的方式,这显然不能满足日常的需求.下面介绍下通过mysql数据库认证 ...
- MPlayer 增加边看边剪切功能
下载 http://pan.baidu.com/s/1ntj0XLn 解压到 D:\MPlayer 前些日子用 FFMpeg 的 FFPlay 来做了视频剪切工具 结果发现 FFPlay 的 CPU ...
- Java for LeetCode 044 Wildcard Matching
Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...