题目分析:

2500的题目为什么我想了这么久。。。

考虑答案是什么。对于一辆从$s$到$t$的车,它有$k$次加油的机会。可以发现实际上是将$s$到$t$的路径以城市为端点最多划分为最大长度最小的$k+1$段。不难发现这样做一定是最优的。

设计DP状态$f[i][j][k]$表示将第$i$座城市到第$j$座城市的路径划分为$k$段。朴素的DP方程是:

$$f[i][j][k] = min(max(f[i][x][k-1],a[j]-a[x])),(which)x \in [i,j]$$

这个DP是$O(n^4)$的,但我们注意到DP状态有单调性。

换句话说,存在一个城市$y$,使得任意$x<y$满足$max(f[i][x][k-1],a[j]-a[x])=a[j]-a[x]$,任意$x>y$满足$max(f[i][x][k-1],a[j]-a[x])=f[i][x][k-1]$。我们考虑的转移只有两个点是有意义的。

对于相同的$i$,$y$的选取仍然具有单调性,所以利用two pointers移动指针可以做到$O(n^3)$

注意:开三维数组会MLE,我们可以滚动一维(甚至可以滚动两维,心动不如行动,试着写一下吧)。

代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn = ; int n,m,a[maxn],nxt[maxn]; struct node{int s,t,oil;}; int f[maxn][maxn][];
vector <node> hh[maxn]; void read(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=m;i++){
int s,t,oil,tms;
scanf("%d%d%d%d",&s,&t,&oil,&tms);
tms = min(tms,t-s-)+;
hh[tms].push_back((node){s,t,oil});
}
} void work(){
long long ans = ;
for(int i=;i<=n;i++) for(int j=i;j<=n;j++) f[i][j][] = a[j]-a[i];
for(int k=;k<=n-;k++){
for(int i=;i<hh[k].size();i++)
ans = max(ans,1ll*f[hh[k][i].s][hh[k][i].t][k&]*hh[k][i].oil);
for(int i=;i<=n;i++){
f[i][i][(k+)&] = ; int pts = i;
for(int j=i+;j<=n;j++){
while(f[i][pts][k&] < a[j]-a[pts])pts++;
f[i][j][(k+)&] = min(f[i][pts][k&],a[j]-a[pts-]);
}
}
}
printf("%lld\n",ans);
} int main(){
read();
work();
return ;
}

Codeforces1101F Trucks and Cities 【滑动窗口】【区间DP】的更多相关文章

  1. codeforces 1101F Trucks and Cities 区间dp+单调优化 好题

    题目传送门 题意简述:(来自洛谷) 有n个城市坐落在一条数轴上,第ii个城市位于位置ai​. 城市之间有m辆卡车穿行.每辆卡车有四个参数:si​为起点编号,fi​为终点编号,ci​表示每行驶1个单位长 ...

  2. Codeforces 1101F Trucks and Cities dp (看题解)

    Trucks and Cities 一个很显然的做法就是二分然后对于每个车贪心取check, 这肯定会TLE, 感觉会给人一种贪心去写的误导... 感觉有这个误导之后很难往dp那个方向靠.. dp[ ...

  3. P1886 滑动窗口&&P1440 求m区间内的最小值

    声明:下面这两个题就不要暴力了,学一学单调队列吧 推荐博文:https://www.cnblogs.com/tham/p/8038828.html 单调队列入门题 P1440 求m区间内的最小值 题目 ...

  4. luogu题解 UVA11536 【Smallest Sub-Array】最短set区间&滑动窗口

    题目链接: https://www.luogu.org/problemnew/show/UVA11536 题目大意: 给定一个\(N,M,K\),构造这样的数列: \(x[1]=1,x[2]=2,x[ ...

  5. 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)

    To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...

  6. 单调队列优化&&P1886 滑动窗口题解

    单调队列: 顾名思义,就是队列中元素是单调的(单增或者单减). 在某些问题中能够优化复杂度. 在dp问题中,有一个专题动态规划的单调队列优化,以后会更新(现在还是太菜了不会). 在你看到类似于滑动定长 ...

  7. CodeForces 701C They Are Everywhere (滑动窗口)

    题目链接:http://codeforces.com/problemset/problem/701/C 题意:找到字符串中能包含所有元素的最短字符串长度. 利用“滑动窗口”解题 解题思路: 1. 遍历 ...

  8. [Leetcode]双项队列解决滑动窗口最大值难题

    这道题是从优先队列的难题里面找到的一个题目.可是解法并不是优先队列,而是双项队列deque 其实只要知道思路,这一道题直接写没有太大的问题.我们看看题 给定一个数组 nums,有一个大小为 k 的滑动 ...

  9. POJ - 2823 Sliding Window (滑动窗口入门)

    An array of size n ≤ 10 6 is given to you. There is a sliding window of size kwhich is moving from t ...

随机推荐

  1. (1)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点: 1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块: 2)系统耦合性强,一旦其中一个模块有问题, ...

  2. 4月27号开学! 第6期《jmeter实战接口自动化+性能》课程,零基础也能学

    2019年 第6期<jmeter实战接口自动化+性能>课程,4月27号开学! 主讲老师:飞天小子 上课方式:QQ群视频在线教学 本期上课时间:4月27号-6月9号,每周六.周日晚上20:0 ...

  3. Mysql:is not allowed to connect to this MySQL server

    连接mysql的时候发生这个错误:ERROR 1130: Host '192.168.1.110' is not allowed to connect to this MySQL server 解决方 ...

  4. 大神教你Debian GNU/Linux 9.7 “Stretch” Live和安装镜像开放下载

    Debian项目团队于昨天发布了Debian GNU/Linux 9 "Stretch" 的第7个维护版本更新,重点修复了APT软件管理器中存在的安全漏洞.在敦促每位用户尽快升级系 ...

  5. Success Rate CodeForces - 807C (数学+二分)

    You are an experienced Codeforces user. Today you found out that during your activity on Codeforces ...

  6. ES使用C#添加和更新文档

    ElasticSearch 使用C#添加和更新文档 这是ElasticSearch 2.4 版本系列的第四篇: 第一篇:ES1:Windows下安装ElasticSearch 第二篇:ES2:Elas ...

  7. HTML中的几种空格

    HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格(       ‌‍)在不同浏览器中宽度各异.     ...

  8. [转帖]一个FORK的面试题

    一个FORK的面试题 https://coolshell.cn 搞不懂 fork 的含义. Linux 里面的线程不是教科书上面的标准的线程 好像用 父子进程来进行 模拟线程的处理 父子线程应该共享 ...

  9. Sqlserver tablediff的简单使用

    1. 先列举一下自己简单的比较语句 tablediff -sourceserver 10.24.160.73 -sourcedatabase cwbasemi70 -sourceschema lcmi ...

  10. 123. 单词搜索(DFS)

    描述 给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词. 单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻.每个单元中的字母最多只能使用一次. 样例 给出 ...