题目链接:https://vjudge.net/contest/164840#problem/B

题意:

从南往北走,横向的时间不能超过 c;

横向路上有权值,求权值最大;

分析:

n<=100,m<=10000

数据范围很大了,基本上要n*m;

分析每个交叉路口,每个交叉路口,可以从下一行的左边,或者下一行的右边过来;

那么这个交叉路口就是max(L[j],R[j]);

怎么得到,某一个交叉路口从左边来,可以有哪些点呢? 不可能循环跑一遍(m的范围);

就用了一个Q双端队列来维护;

怎么得到,从哪个点上来最优呢? 在这个队列中的点也不能循环跑一遍;

还是利用这个队列;维护他这个队列是单调队列就好了,

 #include <bits/stdc++.h>

 using namespace std;

 #define LL long long

 const int maxn = ;
const int maxm = ;
LL f[maxn][maxm],t[maxn][maxm],L[maxm],R[maxm],n,m,c,d[maxn][maxm]; deque<int> Q;
int Lfunc(int j,int i) {
return d[i-][j] - f[i][j];
} int Rfunc(int j,int i) {
return d[i-][j] + f[i][j];
} int main() {
while(scanf("%lld %lld %lld",&n,&m,&c)==&&n) {
for(int i=; i<=n+; i++)
for(int j=; j<=m; j++) {
if(!j) f[i][j] = ;
else {
scanf("%lld",&f[i][j]);
f[i][j]+=f[i][j-];
}
} for(int i=; i<=n+; i++)
for(int j=; j<=m; j++) {
if(!j) t[i][j] = ;
else {
scanf("%lld",&t[i][j]);
t[i][j]+=t[i][j-];
}
} for(int i=; i<=m; i++)
d[][i] = ; for(int i=; i<=n+; i++) {
L[] = d[i-][];
Q.clear();
Q.push_back();
for(int j=; j<=m; j++) {
while(!Q.empty()&&t[i][j]-t[i][Q.front()]>c) {
Q.pop_front();
}
L[j] = d[i-][j]; //从左到达 j 的最优值
if(!Q.empty()) L[j] =max(L[j],Lfunc(Q.front(),i)+f[i][j]);
while(!Q.empty()&&Lfunc(Q.back(),i)<=Lfunc(j,i)) Q.pop_back();
Q.push_back(j);
} R[] = d[i-][m];
Q.clear();
Q.push_back(m);
for(int j=m-; j>=; j--) {
while(!Q.empty()&&t[i][Q.front()]-t[i][j]>c) Q.pop_front();
R[j] = d[i-][j];
if(!Q.empty()) R[j] = Rfunc(Q.front(),i)-f[i][j];
while(!Q.empty()&&Rfunc(Q.back(),i)<=Rfunc(j,i)) Q.pop_back();
Q.push_back(j);
}
for(int j=; j<=m; j++)
d[i][j] = max(L[j],R[j]);
} LL res;
for(int i=; i<=m; i++) {
if(!i) res=d[n+][i];
else res = max(d[n+][i],res);
}
printf("%lld\n",res);
}
return ;
}

最新文章

  1. 如何区别数据库删除语句drop与delete与truncate?
  2. 计数排序(counting-sort)&mdash;&mdash;算法导论(9)
  3. post NSURLConnection请求网络数据
  4. Sublime Text 注册码 License Key
  5. PHP内核探索之变量(3)- hash table
  6. SQLSERVER 脚本转MYSQL 脚本的方法总结
  7. VS2015新功能
  8. log4j:ERROR LogMananger.repositorySelector was null likely due to error in class reloading, using NOPLoggerRepository.
  9. 安装Hadoop系列 — 安装Eclipse
  10. 【js】获得项目路径
  11. 一个小玩具:NDK编译SDL的例子
  12. 搭建lnmp教程
  13. Java进阶(六)Java反射机制可恶问题NoSuchFieldException
  14. MySQL改密码
  15. 技术笔记1:java.sql.SQLException: Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password)
  16. A2D JS框架 - DES加密解密 与 Cookie的封装(C#与js互相加密解密)
  17. Unity 如何检测鼠标双击事件
  18. SDWebImage 的简单使用方法
  19. Spring AOP 源码分析系列文章导读
  20. FFmpeg AVPacket和AVFrame区别

热门文章

  1. 1.rabbitmq 集群版安装及使用nginx进行四层负载均衡设置
  2. js动态实现时分秒
  3. nginx 模块介绍
  4. Tortoise SVN 快速操作手册
  5. unity读取json文件
  6. jquery获取元素与屏幕高度距离
  7. Win10系统安装iis的方法【图文教程】
  8. 转:HTML中让图片滚动的&lt;marquee&gt;标签的使用方法
  9. Eclipse Configuration
  10. SharePoint 2013 - Workflow Manager