题目描述

分析

好题哇
首先我们定义数组f[n][3];
f[i][1]表示srf从第i + 1个数字开始时的最优策略,f[i][2]表示qtc从第i + 1个数字时的最优策略,均表示最终得分
如果当前是srf选,那么表明qtc在i + 1~i + m中已经选过一个数字了,根据最优性判断最后结果一定是最小的,所以我们需要找到最小的那个,然后+a[i],反之则是找最大的
用优先队列或者线段树维护一下最值,优化掉一重循环即可

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstring>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int N = 200010;
ll a[N];
ll f[N][3];
int q1[N],hh1,tt1;
int q2[N],hh2,tt2;
ll s1[N],s2[N];
int n,m;void push1(ll x,int i){while (hh1 <= tt1 && s1[tt1] >= x) --tt1;s1[++tt1] = x,q1[tt1] = i;
}
void push2(ll x,int i){while (hh2 <= tt2 && s2[tt2] <= x) --tt2;s2[++tt2] = x,q2[tt2] = i;
}
void pop1(int i) {while (q1[hh1] >= i) ++hh1;}
void pop2(int i) {while (q2[hh2] >= i) ++hh2;}int main(){scanf("%d%d",&n,&m);for(int i = 1;i <= n;i++) scanf("%lld",&a[i]);hh1 = 0,tt1 = -1;hh2 = 0,tt2 = -1;push1(-a[n],n);push2(a[n],n);for(int i = n - 1;~i;i--){f[i][1] = s2[hh2];f[i][2] = s1[hh1];pop1(i + m);pop2(i + m);push1(f[i][1] - a[i],i);push2(f[i][2] + a[i],i);}printf("%lld\n",f[0][1]);printf("%lld\n",f[0][2]);return 0;
}/**
*  ┏┓   ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃       ┃
* ┃   ━   ┃ ++ + + +
*  ████━████+
*  ◥██◤ ◥██◤ +
* ┃   ┻   ┃
* ┃       ┃ + +
* ┗━┓   ┏━┛
*   ┃   ┃ + + + +Code is far away from  
*   ┃   ┃ + bug with the animal protecting
*   ┃    ┗━━━┓ 神兽保佑,代码无bug 
*   ┃        ┣┓
*    ┃        ┏┛
*     ┗┓┓┏━┳┓┏┛ + + + +
*    ┃┫┫ ┃┫┫
*    ┗┻┛ ┗┻┛+ + + +
*/

LDU训练赛:小srf的游戏 单调队列 + DP相关推荐

  1. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...

  2. P3580 [POI2014]ZAL-Freight(单调队列dp)

    P3580 [POI2014]ZAL-Freight(单调队列dp) 考虑两辆车怎么样是最优的. t1,t2,St_1,t_2,St1​,t2​,S t1+St_1+St1​+S 第一辆车:[t1,t ...

  3. 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)

    题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...

  4. 洛谷P1725琪露诺【单调队列+dp】

    题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河岸去追 ...

  5. AcWing1090.绿色通道(单调队列DP)

    题目传送门 高二数学<绿色通道>总共有 nn 道题目要抄,编号 1,2,-,n,抄第 i 题要花 ai 分钟. 小 Y 决定只用不超过 t 分钟抄这个,因此必然有空着的题. 每道题要么不写 ...

  6. 【CF940E】Cashback(单调队列dp)

    传送门 Solution: 既然是删掉k/c个,那么k<c是不删除的无意义,k=c删除1个,c<=k<2c还是删除1个,那么相当于第c+1个到第k个放在上一区间是无意义的.证明:假如 ...

  7. 刷题总结——烽火传递(单调队列+dp)

    题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...

  8. POJ 1821 单调队列+dp

    题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...

  9. POJ1821-Fence【单调队列,dp】

    正题 题目链接:http://poj.org/problem?id=1821 题目大意 有n个木板,m个工人,每个木板只能被粉刷一次,第i个工人如果刷的话必须刷木板SiSiS_i,连续的不超过LiLi ...

  10. P3957-跳房子【单调队列,dp,二分】

    前言 链接: https://www.luogu.org/record/show?rid=7915892 这就是之前普及组的第四题- 大意 有n个格子,每个格子有价值.机器人有固定的跳跃距离d,用k个 ...

最新文章

  1. python经典好书-python经典书籍推荐
  2. Concurrent集合 Atomic类
  3. android无感刷新下拉分页,GitHub - TakWolf/Android-RefreshAndLoadMore-Demo: 一种简单的并且优雅的方式实现下拉刷新和加载更多的分页效果。...
  4. wince中BIB文件的详细介绍
  5. 易写易库(EXEK)玩“花”儿之三:命令有图标支持库,附图
  6. 数据结构与算法-字典的时间复杂度
  7. .NET中使用Redis
  8. hibernate中get方法和load方法的根本区别
  9. C#LeetCode刷题之#434-字符串中的单词数​​​​​​​(Number of Segments in a String)
  10. 佳能发售曝光对应的「IXY DIGITAL 3000 IS」
  11. mysql数据库中文乱码解决
  12. js中arguments的用法
  13. 二叉树的镜像(C++)
  14. 欧冠抽签程序c语言,欧冠抽签
  15. Mac 给新人的入手指南
  16. 动态加密?看我如何见招拆招爬取某点评全站内容!
  17. kpi绩效考核流程图_绩效考核流程图
  18. 大屏可视化之适配和布局
  19. 关于 Cannot assign requested address 错误
  20. C++描述 LeetCode 1768. 交替合并字符串

热门文章

  1. CodeForces #352B.Jeff and Periods
  2. appbase 和docbase
  3. IDEA 出现编译错误 Multi-catches are not supported a this language level 解决方法
  4. 怎么克隆计算机的mac,选中克隆为当前电脑MAC地址
  5. Python数据分析(1):Matplotlib
  6. [ITIL学习笔记]ITIL认证相关
  7. idea自定义banner
  8. 分裂基 c语言算法,分裂基快速傅里叶变换 - osc_v8jmwk6w的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. MySQL批量创建测试数据脚本
  10. Weighted Boxes Fusion加权检测框合并