题目链接
感谢emofunx提供解题思路和耐心答疑!

题目大意:

给你一个高度为n的数字金字塔,求它的所有高度为k的子金字塔的最大值的总和。(1≤k≤n≤3000)(1\le k \le n \le 3000)(1≤k≤n≤3000)

样例输入:

4 2
3
1 2
4 2 1
6 1 4 2

样例输出:

23

解题思路:

对于一个可以移动的固定大小区间内的区间,我们可以想到用滑窗去解决,但是这是二维的,而且还是三角形,咋滑啊?
这时候emofunx说道:其实这类问题的处理都差不多,就是可能麻烦点。
注意到一个大的三角形,是可以由多个小的三角形组成的,这时候我们可以想倍增:预处理出所有高为2^i的三角形的最值。那么2i2^i2i高度的三角形如何推出2i+12^{i+1}2i+1的三角形呢,看图:

如图,可以用三个2i2^i2i高度的三角形拼出1个中空的2i+12^{i+1}2i+1的三角形,因为有空洞,我们不能直接递推。但是我们可以发现:

假设当前三角形左下角为(x,y)(x,y)(x,y)红色这部分的面积可以被左下角坐标为(x,y)到(x+2i,y)(x,y)到(x+2^i, y)(x,y)到(x+2i,y),高度为2i2^i2i的这2i+12^i+12i+1个小三角形完全覆盖。
所以我们可以用滑窗法维护一段区间长度固定的数字的最值来转移维护出倍增数组。最后也可以用滑窗来利用倍增数组得到每个大小为k的子金字塔的最大值,把它们都加到答案里就完事儿了。
ac代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 3e3 + 50;
int f[2][maxn][maxn], a[maxn][maxn];
int n, k;
int q[maxn], head, tail;
int main()
{cin>>n>>k;for(int i = 1; i <= n; ++i){for(int j = 1; j <= i; ++j) scanf("%d", &a[i][j]), f[0][i][j] = a[i][j];} ll ans = 0;if(k == 1){// 特判for(int i = 1; i <= n; ++i){for(int j = 1; j <= i; ++j) ans += a[i][j];}cout<<ans<<endl; return 0;}int cur = 0;for(int t = 1; ; ++t){cur ^= 1;//滚动倍增数组int len, l;//需要获取的三角形大小,滑窗的大小if((1<<t) < k) len = (1<<t), l = len>>1;else len = k, l = k - (1<<(t-1));l++;for(int i = len; i <= n; ++i){head = tail = 0;int o = 1;for(int j = 1; j + len - 1 <= i; ++j){while(o <= j + l - 1){//滑窗获取区间最值while(tail > head && f[cur^1][i][q[tail-1]] <= f[cur^1][i][o]) tail--;q[tail++] = o++;}f[cur][i][j] = max(f[cur^1][i][q[head]], f[cur^1][i-l+1][j]);if(len == k) ans = ans + (ll) f[cur][i][j];if(q[head] == j) head++;}}if(len == k) break;}cout<<ans<<endl;
}
/*
4 3
3
1 2
2 1 3
4 1 1 1
*/

CCC '19 S5 - Triangle: The Data Structure(倍增 + 滑窗最大值)相关推荐

  1. CF data structure 自制题单(一)

    CF data structure 2000~2100 为你的战斗,献上雷鸣般的喝彩!--唔姆 目标 30 道题 1. Problem - 1555E - Codeforces 看了提示 给一些线段, ...

  2. LeetCode Two Sum III - Data structure design

    原题链接在这里:https://leetcode.com/problems/two-sum-iii-data-structure-design/ 题目: Design and implement a ...

  3. TRIE - Data Structure

    Introduction 介绍 Trie,又称单词查找树,是一种树形结构,用于保存大量的字符串.它的优点是:利用字符串的公共前缀来节约存储空间. Trie is an ordered tree dat ...

  4. leetcode 211. Add and Search Word - Data structure design Trie树

    题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...

  5. leetcode Add and Search Word - Data structure design

    我要在这里装个逼啦 class WordDictionary(object):def __init__(self):"""initialize your data str ...

  6. 牛客小白月赛11:Rinne Loves Data Structure

    Rinne Loves Data Structure 思路 我们插入的位置大概分了四种: 第一种 显然我们找到比当前插入的值的pre,也就是比当前节点大的最小值. 第二种 我们只要找到当前节点的suc ...

  7. HDU - 7072 Boring data structure problem 双端队列 + 思维

    传送门 文章目录 题意: 思路: 题意: 你需要实现如下四个操作 q≤1e7q\le1e7q≤1e7 思路: 做的时候想了个链表的思路让队友写了,懒. 看了题解感觉题解还是很妙的. 你需要快速插入一个 ...

  8. HDU - 6967 G I love data structure 线段树维护矩阵 + 细节

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的数组a,ba,ba,b,你需要完成如下四种操作: 思路: 思路还是比较简单的,首先建一颗线段树,线段树中维护a,b,a2,b2,aba, ...

  9. 170. Two Sum III - Data structure design【easy】

    170. Two Sum III - Data structure design[easy] Design and implement a TwoSum class. It should suppor ...

最新文章

  1. 数据结构:二分查找算法
  2. Kotlin实战指南十:let、apply、with、run
  3. 【转】C#调用ADOX创建Access数据文件后关闭连接
  4. SQL Serever学习7——数据表2
  5. 解决:idea - maven project 中 jar 报红线
  6. ROS笔记(29) 启动Movelt!
  7. [计算机网络] - DNS基础介绍
  8. 一步一步写算法(之双向链表)
  9. python 读取excel表数据_5分钟学会用Python 读取Excel
  10. 都是打工的,为啥职场中存在着那么多勾引斗角?
  11. Linux之文件基础操作命令
  12. 并发编程学习之延时队列DelayQueue
  13. 最有效的更改linux 系统时区的方法
  14. springboot连接redis进行CRUD
  15. uva 12230 - Crossing Rivers(概率)
  16. 第三章 硅谷宠儿 Friendster (一)
  17. win7开机卡在正在启动_电脑重装了系统,却卡在图标截面
  18. 无监督关键短语的生成问题博客02--extract.py的分析
  19. 云海麒麟计算机系统有限公司,北京云海麒麟容错服务器厂商
  20. c语言stdlib h常用函数,c语言中,头文件stdlib.h主要包含什么函数?

热门文章

  1. python图像增强算法_retinex图像增强算法的研究
  2. 使用elastic-job 发生Invalid bean definition with name异常
  3. 股票的量化分析模型是怎样的?
  4. mysql建表语句规范
  5. Autolayout代码实现
  6. 噪声容限与TTL、CMOS、EIA、485电平及应用
  7. leetcode中出现执行代码和提交时候答案不一致时候,
  8. 提取word字体样式到另一个word
  9. git 拉取远程仓库分支代码
  10. Parameter Server架构