n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<=n*n,ci<=1e5,现T<=1e5个询问:从Ai出发,带Yi<=n*n块钱走不少于Si<=1e9的路程,问最多剩多少钱。

方法一:其实就是问从某个点出发,走路程Si,问最少花费。F(i,j,k)--从i出发,剩下j的油,走路程k最小花费,决策一下在i要不要加油即可。

方法二:走路程Si问最小花费-->花费q问最长路程。F(i,j,q)--从i出发剩j的油,用q块钱最长路程,决策一下要不要在i加油即可。

方法三:整个路程其实就是由几个加油处为中转点拼起来的,因此只用加油处的状态就可以勾勒整个过程,而加油处加完油后,油箱状态和之前没关系,可以省掉。F(i,q)--从i出发用q块钱最长路程,F(i,q)=max(F(j,q-pi)+G(i,j)),G(i,j)表示从i开始,到j,经过不超过min(ci,C)条路的最长路。

G(i,j)的计算可以用倍增:W(i,j,k)表示i到j经过不超过2^k步的最长路程,用W来拼凑G。

最后询问时,在F(Ai)数组里二分找F(Ai,j)>=Si的最小的j,得答案。

有点复杂。。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
//#include<iostream>
using namespace std; bool isdigit(char c) {return c>='' && c<='';}
int qread()
{
char c;int s=,t=;while (!isdigit(c=getchar())) (c=='-' && (t=-));
do s=s*+c-''; while (isdigit(c=getchar())); return s*t;
}
int n,m,C,T;
#define maxn 111
#define maxm 2017
struct Edge{int to,v,next;}edge[maxm];int first[maxn],le=;
void in(int x,int y,int v) {Edge &e=edge[le];e.to=y;e.v=v;e.next=first[x];first[x]=le++;} #define LL long long
LL f[maxn][maxn*maxn],g[maxn][maxn],tmp[maxn][maxn],w[maxn][maxn][],c[maxn],p[maxn];
const LL inf=1e16;
void prebz()
{
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
w[i][j][]=-inf;
for (int i=;i<=n;i++)
{
w[i][i][]=;
for (int j=first[i];j;j=edge[j].next)
{
const Edge &e=edge[j];
w[i][e.to][]=e.v;
}
}
for (int k=;k<=;k++)
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
w[i][j][k]=-inf;
for (int x=;x<=n;x++)
w[i][j][k]=max(w[i][j][k],w[i][x][k-]+w[x][j][k-]);
}
for (int i=;i<=n;i++)
{
int o=min(c[i],1ll*C);
for (int j=;j<=n;j++) g[i][j]=-inf;
g[i][i]=;
for (int k=;k>=;k--) if (o&(<<k))
{
for (int j=;j<=n;j++) tmp[i][j]=-inf;
for (int j=;j<=n;j++)
for (int x=;x<=n;x++)
tmp[i][j]=max(tmp[i][j],g[i][x]+w[x][j][k]);
for (int j=;j<=n;j++) g[i][j]=tmp[i][j];
}
}
} void predp()
{
for (int j=;j<=n*n;j++)
for (int i=;i<=n;i++)
{
f[i][j]=;
if (j>=p[i]) for (int x=;x<=n;x++) f[i][j]=max(f[i][j],f[x][j-p[i]]+g[i][x]);
}
} void init()
{
n=qread(),m=qread(),C=qread(),T=qread();
for (int i=;i<=n;i++) p[i]=qread(),c[i]=qread();
for (int i=,x,y,z;i<=m;i++)
{
x=qread(),y=qread(),z=qread();
in(x,y,z);
}
} int main()
{
init();
prebz();
predp();
while (T--)
{
int x=qread(),y=qread(),z=qread();
int t=lower_bound(f[x]+,f[x]++n*n,z)-f[x];
if (t<=y) printf("%d\n",y-t);
else puts("-1");
}
return ;
}

LOJ#539. 「LibreOJ NOIP Round #1」旅游路线的更多相关文章

  1. LOJ #539. 「LibreOJ NOIP Round #1」旅游路线 倍增floyd + 思维

    考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正 ...

  2. LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)

    哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走c ...

  3. 【LibreOJ】#539. 「LibreOJ NOIP Round #1」旅游路线

    [题意]给定正边权有向图,车油量上限C,每个点可以花费pi加油至min(C,ci),走一条边油-1,T次询问s点出发带钱q,旅行路程至少为d的最多剩余钱数. n<=100,m<=1000, ...

  4. LibreOj #539. 「LibreOJ NOIP Round #1」旅游路线

    题目链接 做完这道题,我深知当一个问题复杂度过高的时候,把一些可以分离的操作都分散开,可以大幅度降低复杂度..... 发现无论有多少钱,每到一个点后扩展到的距离被限制在 \(min(C, c[i])\ ...

  5. 「LOJ 539」「LibreOJ NOIP Round #1」旅游路线

    description 题面较长,这里给出题目链接 solution 考虑预处理出\(f[i][j]\)表示在第\(i\)个点加满油后,从第\(i\)个点出发,至多消耗\(j\)元钱走过的最大路程,那 ...

  6. 「LibreOJ NOIP Round #1」旅游路线

    Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...

  7. LOJ#541. 「LibreOJ NOIP Round #1」七曜圣贤

    有一辆车一开始装了编号0-a的奶茶,现有m次操作,每次操作Pi在[-1,b),若Pi为一个未出现过编号的奶茶,就把他买了并装上车:若Pi为一个在车上的奶茶,则把他丢下车:否则,此次操作为捡起最早丢下去 ...

  8. 「LOJ 537」「LibreOJ NOIP Round #1」DNA 序列

    description NOIP 复赛之前,HSD 桑进行了一项研究,发现人某条染色体上的一段 DNA 序列中连续的\(k\)个碱基组成的碱基序列与做题的 AC 率有关!于是他想研究一下这种关系. 现 ...

  9. 「LOJ 538」「LibreOJ NOIP Round #1」数列递推

    description sosusosu 虐爆 OI 之后成为了一名文化课选手.一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式: 给定一个下标从\(0\)开始,无限长的整数列\({a_ ...

随机推荐

  1. joda日期格式转换

    public static String parseDateTime(String date,String formatFrom,String formatTo){ DateTimeFormatter ...

  2. php安装ionCube

  3. form表单ajaxSubmit提交并验证

    html: <form class="register-form" action="{:U('')}" method="post"&g ...

  4. thinkphp查询,3.X 5.0 亲试可行

    [php] view plain copy   print? 一.介绍 ThinkPHP内置了非常灵活的查询方法,可以快速的进行数据查询操作,查询条件可以用于读取.更新和删除等操作,主要涉及到wher ...

  5. [安卓开发板]迅为IMX6 四核Android开发板

    工业级核心板-Android开发板 10层高速PCB设计,充分保证电磁兼容 处理器:开发板默认是四核商业扩展级芯片,可根据用户需求更换单核.双核.工业级.汽车级处理器,批量更省成本. 扩展引脚:320 ...

  6. Android(java)学习笔记196:ContentProvider使用之内容观察者01

    1. 内容观察者 不属于四大组件,只是内容提供者ContentProvider对应的小功能. 如果发现数据库内容变化了,就会立刻观察到. 下面是逻辑图:       当A应用中银行内部的数据发生变化的 ...

  7. 删数问题(Noip1994)

    1321:[例6.3]删数问题(Noip1994) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 5127     通过数: 1595 [题目描述] 输入一个高精度 ...

  8. Java基础(十一)--Serializable和Externalizable接口实现序列化

    序列化在日常开发中经常用到,特别是涉及到网络传输的时候,例如调用第三方接口,通过一个约定好的实体进行传输,这时你必须实现序列 化,这些都是大家都了解的内容,所以文章也会讲一下序列化的高级内容. 序列化 ...

  9. gprc-java与golang分别实现服务端,客户端,跨语言通信(一.java实现)

    1.在pom中引入 <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty< ...

  10. 关于C/C++的一些思考(3)

    操作符重载函数(Operator Overload Function)的基本概念: 目的是以与对待内置数据类型相同的方式对待用户自定义类型(程序执行速度会受到影响),限制是不能随意选择函数名和参数个数 ...