【LibreOJ】#539. 「LibreOJ NOIP Round #1」旅游路线
【题意】给定正边权有向图,车油量上限C,每个点可以花费pi加油至min(C,ci),走一条边油-1,T次询问s点出发带钱q,旅行路程至少为d的最多剩余钱数。
n<=100,m<=1000,C<=10^5,q<=n^2。
【算法】动态规划
【题解】官方题解
虽然不是DAG,但是由于q很小的特点,将q加入状态就满足DP的无后效性了。
令f[i][q]表示当前在i点并在i点加油,加油前钱数为q的最大路程。(q<pi时,f[i][q]=0)
假设下一加油点为j,转移方程:f[i][q]=max{f[j][q-pi]+w(i,j,ci)},其中w(i,j,c)表示i点到j点,油量为c的最大路程。(ci=min(ci,C))
现在主要问题是预处理w(i,j,ci),发现每走一条边c只会减少1,符合倍增变化规则一致的特点,考虑图上倍增。
虽然不是DAG,但是c加入状态就满足DP的无后效性了。
g(i,j,k)表示i点到j点,油量为2^k的最大路程,显然g(i,j,k)=max{g(i,x,k-1)+g(x,j,k-1)},x是中转点。
对于w(i,j,ci),将ci拆分二进制,每次枚举x作为中转点后直接取倍增数组g计算答案。
【倍增的思想是很经典的,将需要的ci拆分二进制后将1的位用倍增数组堆起来。但是应用到图上每次就都需要遍历全图作为可能的中转点,最后找到最优答案。】
最后得到了f[i][q],对每个询问在f[s]上二分到第一个大于等于d的f[s][q],q就是答案。
复杂度O(n^4+n^3*log k+T*log n^2),瓶颈复杂度O(n^4)。(n^4过100……)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std;
int read(){
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
const int maxn=,maxm=,maxk=,inf=0x3f3f3f3f;
int n,m,C,T,tot;
int g[maxn][maxn][maxk],p[maxn],c[maxn],A[maxn],B[maxn],w[maxn][maxn],f[maxn][maxn*maxn];
void cmax(int &a,int b){if(b>a)a=b;}
int main(){
n=read();m=read();C=read();T=read();
for(int i=;i<=n;i++)for(int j=;j<=n;j++)for(int k=;k<=;k++)g[i][j][k]=-inf;
for(int i=;i<=n;i++)p[i]=read(),c[i]=min(C,read()),g[i][i][]=;
for(int i=;i<=m;i++){
int u=read(),v=read(),w=read();
g[u][v][]=w;
}
for(int k=;k<=;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
for(int x=;x<=n;x++)cmax(g[i][j][k],g[i][x][k-]+g[x][j][k-]);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)A[j]=-inf;A[i]=;
for(int k=;k<=;k++)if((c[i]>>k)&){
for(int j=;j<=n;j++){
B[j]=-inf;
for(int x=;x<=n;x++)cmax(B[j],A[x]+g[x][j][k]);
}
for(int j=;j<=n;j++)A[j]=B[j];
}
for(int j=;j<=n;j++)w[i][j]=A[j];
}
for(int q=;q<=n*n;q++)
for(int x=;x<=n;x++)if(q>=p[x])
for(int y=;y<=n;y++)cmax(f[x][q],f[y][q-p[x]]+w[x][y]);
while(T--){
int s=read(),q=read(),d=read();
int pl=lower_bound(f[s],f[s]+n*n+,d)-f[s];
if(pl>q)printf("-1\n");else printf("%d\n",q-pl);
}
return ;
}
【LibreOJ】#539. 「LibreOJ NOIP Round #1」旅游路线的更多相关文章
- LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)
哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走c ...
- LOJ#539. 「LibreOJ NOIP Round #1」旅游路线
n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<= ...
- LOJ #539. 「LibreOJ NOIP Round #1」旅游路线 倍增floyd + 思维
考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正 ...
- 「LOJ 539」「LibreOJ NOIP Round #1」旅游路线
description 题面较长,这里给出题目链接 solution 考虑预处理出\(f[i][j]\)表示在第\(i\)个点加满油后,从第\(i\)个点出发,至多消耗\(j\)元钱走过的最大路程,那 ...
- LibreOj #539. 「LibreOJ NOIP Round #1」旅游路线
题目链接 做完这道题,我深知当一个问题复杂度过高的时候,把一些可以分离的操作都分散开,可以大幅度降低复杂度..... 发现无论有多少钱,每到一个点后扩展到的距离被限制在 \(min(C, c[i])\ ...
- 「LibreOJ NOIP Round #1」旅游路线
Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...
- LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力
二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...
- LibreOJ #528. 「LibreOJ β Round #4」求和
二次联通门 : LibreOJ #528. 「LibreOJ β Round #4」求和 /* LibreOJ #528. 「LibreOJ β Round #4」求和 题目要求的是有多少对数满足他们 ...
- LibreOJ #527. 「LibreOJ β Round #4」框架
二次联通门 : LibreOJ #527. 「LibreOJ β Round #4」框架 /* LibreOJ #527. 「LibreOJ β Round #4」框架 %% xxy dalao 对于 ...
随机推荐
- return语句的用法
1.return语句的作用:a.返回一个值,这个值可以是任意类型.b.使程序返回到操作系统(即终止程序)2.java中对于一个函数,不论有没有返回值类型,都可以带有return 语句.但是区别在于,r ...
- 最多水容器(M)
题目 给定n个非负整数a 1,a 2,...,a n,其中每个代表坐标(i,a i)处的一个点.绘制n条垂直线,使得线i的两个端点处于(i,a i)和(i,0)处.找到两条线,它们与x轴一起形成一个容 ...
- Windows网络编程系列教程之四:Select模型
讲一下套接字模式和套接字I/O模型的区别.先说明一下,只针对Winsock,如果你要骨头里挑鸡蛋把UNIX下的套接字概念来往这里套,那就不关我的事. 套接字模式:阻塞套接字和非阻塞套接字.或者叫同步套 ...
- TCP系列36—窗口管理&流控—10、linux下的异常报文系列接收
在这篇文章中我们看一下server端在接收到异常数据系列时的处理,主要目的是通过wireshark示例对这些异常数据系列的处理有一个直观的认识,感兴趣的自行阅读相关代码和协议,这里不再进行详细介绍 在 ...
- 腾讯云 activeMQ Illegal character in hostname at index 7
查找问题步骤: 1. /usr/local/apache-activemq-5.9.1/data/activemq.log 看一下这个.log后缀的启动日志,可以将它下载下来再看. 先尝试修改配置文 ...
- docker中crontab无法运行
yum install -y crontabssed -ri 's/.*pam_loginuid.so/#&/' /etc/pam.d/crond vi /etc/pam.d/crond ...
- md5和base64加密解密
import java.io.IOException; import java.security.MessageDigest; import sun.misc.BASE64Encoder; impor ...
- HUAS 1482 lsy的后宫(DP+矩阵快速幂)
这道题的DP是很好想的,令dp[i][j]表示第i个位置摆第j种妹子的方法数,j为0表示不摆妹子的方法数. dp[i][j]=sigma(dp[i-1][k])(s[j][k]!='1').容易看出这 ...
- 【bzoj4721】[Noip2016]蚯蚓 乱搞
题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓.蛐 ...
- Socket_SSH-1
服务器端: import socket,os server=socket.socket() server.bind(('localhost',9999)) server.listen() while ...