好神啊。。。

考虑维护d[i][j]表示st到i需要经过j个为x的边的最短路,这个就是分层图的最短路了

然后就可以发现,y=kx+b其中k=j,b=d[i][j],有很多直线,然后我们要的就是一个单增的上凸包

这个直线最多只有n条,因为一个点经过多次肯定就是有环,那么一定不优

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL;
const int _=1e2;
const int maxn=5*1e2+_;
const int maxm=1e4+_;
const double eps=1e-8;
struct node
{int x,y,next;LL d;
}a[maxm];int len,last[maxn];
void ins(int x,int y,LL d)
{len++;a[len].x=x;a[len].y=y;a[len].d=d;a[len].next=last[x];last[x]=len;
}//----------------------------------------------def---------------------------------------------------------int n,st,ed;
struct dij
{int x,c;LL d;dij(){} dij(int X,int C,LL D){x=X,c=C,d=D;}friend bool operator >(dij d1,dij d2){return d1.d>d2.d;}friend bool operator <(dij d1,dij d2){return d1.d<d2.d;}
};priority_queue< dij,vector<dij>,greater<dij> >q;
int mc; LL d[maxn][maxn]; bool v[maxn][maxn];//不可能跑环(不优),所以只需要点数步
void dijkstra()
{memset(d,63,sizeof(d));d[st][0]=0;memset(v,false,sizeof(v));q.push(dij(st,0,d[st][0]));while(!q.empty()){dij tno=q.top();q.pop();int x=tno.x,c=tno.c; if(x==ed)mc=max(mc,c);if(v[x][c]==true)continue;v[x][c]=true;for(int k=last[x];k;k=a[k].next){int y=a[k].y;if(a[k].d<0){if(d[y][c+1]>d[x][c]&&c<n){if(y==ed){int q;q++;}d[y][c+1]=d[x][c];q.push(dij(y,c+1,d[y][c+1]));}}else{if(d[y][c]>d[x][c]+a[k].d){d[y][c]=d[x][c]+a[k].d;q.push(dij(y,c,d[y][c]));}}}}
}//----------------------------------------------dij---------------------------------------------------------//系数k: 0~n: d值
double getx(int i,int j){return double(d[ed][j]-d[ed][i])/double(i-j);}
LL gg(int i,int j)//i管理的范围的后界
{double x=getx(i,j);if(fabs(double(x)-double(int(x)))<=eps)x-=0.5;return int(floor(x));
}int top,sta[maxm];
char ss[10];
int main()
{freopen("a.in","r",stdin);freopen("a.out","w",stdout); int m,x,y,dd;scanf("%d%d",&n,&m); len=1;for(int i=1;i<=m;i++){scanf("%d%d%s",&x,&y,ss+1);if(ss[1]=='x')ins(x,y,-1);else{int sslen=strlen(ss+1);dd=0;for(int i=1;i<=sslen;i++)dd=dd*10+ss[i]-'0';ins(x,y,dd);}}int Q;scanf("%d",&Q);while(Q--){scanf("%d%d",&st,&ed);mc=-1;dijkstra();if(mc==-1)puts("0 0");else if(d[ed][0]==d[0][0])puts("inf");else{top=1;sta[top]=0;for(int i=1;i<=mc;i++)if(d[ed][i]!=d[0][0]&&d[ed][i]+i<=d[ed][sta[top]]+sta[top]){while(top>1&& getx(i,sta[top-1])>=getx(sta[top],sta[top-1]) )top--;if(gg(i,sta[top])>0)sta[++top]=i;}LL l=1,r,ans=0; for(int i=top;i>=2;i--){r=gg(sta[i],sta[i-1]);LL k=sta[i],b=d[ed][sta[i]];ans+=(r-l+1)*b+((l+r)*(r-l+1)/2)*k;l=r+1;}ans+=d[ed][0];printf("%lld %lld\n",l,ans);}}return 0;
}

转载于:https://www.cnblogs.com/AKCqhzdy/p/10370526.html

bzoj3482: [COCI2013]hiperprostor相关推荐

  1. bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】

    正题 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3482 题目大意 一张有向图有正整数边权也有xxx边权.其中xxx可以取任何值(但是 ...

  2. 【COCI2013】slasticar

    题目大意 给出一个长度为n的字符串A,接下来给出m个字符串,对于每个字符串B,用给出的方法去与A匹配: 1. 设B的长度为L,先与A的位置为1-L的一段进行匹配:先比较A[1]和B[1],接下来比较A ...

  3. 欢乐纪中某A组赛【2019.7.11】

    前言 话说今天好像放做题导致BBB组贼难AAA组还好. 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 RankRankRank PersonPersonPerson ScoreScoreSco ...

  4. 2019纪中暑假游记+总结

    Travels总篇\texttt{Travels总篇}Travels总篇 7/4\texttt{7/4}7/4 下午才去纪中,早上就一大早和同学出去玩,看了蜘蛛侠然后到3点多才出发. 因为走南沙大桥所 ...

  5. vue页面滚动动画——wow.js教程

    WOW.js 是一款帮助你实现滚动页面时触发CSS 动画效果的插件. 缺陷:当页面向下滚动时,动画出现:当页面向上回滚时,动画不会回退.(即动画仅出现一次!) 官网地址  https://www.de ...

  6. Vue+wow.js+animate.css-实现页面滚动可视区域动画效果展示-案例

    说明 wowjs-当页面向下滚动时,动画出现:当页面向上回滚时,动画不会回退. 安装 npm install wowjs --save-dev npm install animate.css --sa ...

  7. vue中使用wow.js

    首先 安装wow npm install wowjs --save-dev animate.css会自动安装 在 main.js中 引用 require('animate.css/animate.mi ...

  8. vue使用wow.js

    先安装 npm install wowjs --save-dev 注意:"animate.css"版本要选择: "^3.7.2 要不然动画不显示 然后再main.js i ...

  9. 【自己的整理】页面滚动时触发动画特效 wow.js + Animate.css

    在页面添加初始动画特效 在页面添加初始动画特效的时候无意接触到wow.js 这个动画库配合Animate.css可以按照模板快速创建动画效果,虽然动画效果就像ppt里面的动画效果一样... 环境设置 ...

最新文章

  1. svd协同过滤java实现_利用 SVD 实现协同过滤推荐算法
  2. 圆形和多边形雷达图python-Matplotlib绘制雷达图和三维图的示例代码
  3. PHP 错误与异常的日志记录
  4. 机器学习(part1)--机器学习第一课
  5. Ubuntu12 10下安装JDK7
  6. mysql授予权限和撤销权限的关系_MySQL数据库常用的授予权限和撤销权限的命令讲解...
  7. jekenis父子结构项目打包_全栈之DevOps系列 - 发布 Python 项目 开源/私有 包
  8. 大数据---单词释义
  9. Java中的时间和日期(下)
  10. C# 无法识别的转义序列
  11. Java对象锁和类锁全面解析(多线程synchronized关键字)
  12. 查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件)...
  13. ubuntu1604安装网卡驱动 联想g510
  14. sata接口 图解 定义_【sata硬盘三个接口】sata硬盘接口图解_sata硬盘接口电路
  15. 通过一道CTF题,学习pillow模块切割、合并图片
  16. WECHAT 微信扫码关注公众号方法无法获取头像和昵称了
  17. linux 下的字体引擎
  18. iOS开发-iOS10新特性及开发者主要注意点
  19. 微信开发者工具的使用(一)
  20. 走近棒球运动·亚洲职棒大赛·MLB棒球创造营

热门文章

  1. Cocos2d-x中常用的类
  2. 计算机网络性能(2)
  3. 游戏筑基开发之变量、运算符、转义字符的注意点(C语言)
  4. Hybrid 接口应用
  5. LAMP架构调优(九)——Apache Rewrite功能实战
  6. 802.11介质访问控制——CSMA/CD协议详解
  7. IS-IS详解(十八)——IS-IS 缺省路由
  8. 初始化Metasploit-Framework
  9. IBM与西班牙桑坦德银行合作,推广企业级 iOS 银行应用
  10. 《TCP/IP详解卷1:协议》第12章 广播和多播---读书笔记