Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)
Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)
题意
给定一个nm的矩阵,每行取2k的矩阵,求总共矩阵里的数的和最大值,重复取到的数不算
题解
dp[i]表示当前行从第i个数开始取矩阵的最大值
dp[i] = 上一行中最大数 + 当前行第i个数到第i+k-1个数的和 - 当前行重复的 + 下一行第i个数到第i+k-1个数的和
用线段树维护 上一行中最大数 + 当前行第i个数到第i+k-1个数的和 - 当前行重复的
从当前行第1个数开始对上一行的dp值做上述操作,每当往右移一个数做dp,只要做当前区间的头尾删除和增加操作,具体操作看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 50010;
int tree[N*4], upd[N*4], dp[N], a[101][N], pre[101][N];
void build(int x,int l,int r)
{
if (l == r) tree[x] = dp[l];
else
{
int mid = (l + r) >> 1;
build(x*2, l, mid);
build(x*2+1, mid + 1, r);
upd[x] = 0;
tree[x] = max(tree[x*2], tree[x*2+1]);
}
}
void add(int x, int l,int r,int ll,int rr,int v)
{
if (ll > rr) return;
if (ll <= 0) return;
if (l == r)
{
tree[x] += v;
return;
}
if (ll <= l && r <= rr)
{
upd[x] += v;
tree[x] += v;
}
else
{
tree[x * 2] += upd[x];
upd[x * 2] += upd[x];
tree[x * 2 + 1] += upd[x];
upd[x * 2 + 1] += upd[x];
upd[x] = 0;
int mid = (l + r) >> 1;
if (ll <= mid) add(x * 2, l, mid, ll, rr, v);
if (rr > mid) add(x * 2 + 1, mid + 1, r, ll, rr, v);
tree[x] = max(tree[x * 2], tree[x * 2 + 1]);
}
}
int main()
{
int n, m, k;
cin >> n >> m >> k;
k--;//j + k - 1 -> j + k,纯粹是懒
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
cin >> pre[i][j];
a[i][j] = pre[i][j];
pre[i][j] += pre[i][j - 1];
}
for (int j = 1; j + k <= m; j++)
{
dp[j] = pre[1][j + k] - pre[1][j - 1] + pre[2][j + k] - pre[2][j - 1];
}
for (int i = 2; i <= n; i++)
{
build(1,1,m-k);
for (int j = 1; j <= k + 1; j++) add(1,1,m-k,j+1,m-k,a[i][j]);//对上一行的dp值增加没有重复的第一个区间的值
dp[1] = tree[1] + pre[i+1][k+1];
for (int j = 2; j + k <= m; j++)
{
add(1,1,m-k,1,j-1,a[i][j+k]);
add(1,1,m-k,j+k+1,m-k,a[i][j+k]);//对没有和a[i][j+k]重复的dp值加上a[i][j+k]
add(1,1,m-k,j,m-k,-a[i][j-1]);
add(1,1,m-k,1,j-k-2,-a[i][j-1]);//对增加过a[i][j-1]的dp减去a[i][j-1]
dp[j] = tree[1] + pre[i+1][j + k] - pre[i+1][j-1];
}
}
build(1,1,m-k);
cout << tree[1] << endl;
// system("pause");
}
Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)的更多相关文章
- Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树
C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...
- Codeforces Round #254 (Div. 1) C. DZY Loves Colors 线段树
题目链接: http://codeforces.com/problemset/problem/444/C J. DZY Loves Colors time limit per test:2 secon ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线
D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)
题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...
- Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)
题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...
- Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash
E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/prob ...
- [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】
题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- Codeforces Round #207 (Div. 1) A. Knight Tournament (线段树离线)
题目:http://codeforces.com/problemset/problem/356/A 题意:首先给你n,m,代表有n个人还有m次描述,下面m行,每行l,r,x,代表l到r这个区间都被x所 ...
随机推荐
- Groovy重载操作符
重载一时爽,一直重载一直爽. 最近在读<Groovy in action>一本书重新复习了Groovy的一些语法特性,迷恋上这个重载操作符的功能,坚持爽的不要要的.分享一个Demo. 由于 ...
- 《C++Primer》第五版习题解答--第四章【学习笔记】
[C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...
- html 小游戏合集(1.0)
最近做了个小游戏合集,有点沙雕,毕竟是1.0,将就看看. <!DOCTYPE html> <html> <head> <meta charset=" ...
- C++中全排列函数next_permutation 用法
今天蓝桥杯刷题时发现一道字符串排序问题,突然想起next_permutation()函数和prev_permutation()函数. 就想写下next_permutation()的用法 next_pe ...
- Elasticsearch系列---搜索执行过程及scroll游标查询
概要 本篇主要介绍一下分布式环境中搜索的两阶段执行过程. 两阶段搜索过程 回顾我们之前的CRUD操作,因为只对单个文档进行处理,文档的唯一性很容易确定,并且很容易知道是此文档在哪个node,哪个sha ...
- Linux环境下Mysql开启远程访问权限
如何通过Window的数据库可视化工具远程连接装在Linux上的Mysql呢?可以按照以下步骤逐一确认! 检查监听端口是否存在 netstat -ntlp |grep mysql 检查Mysql配置配 ...
- 测试必备之Java知识(二)—— Java高级的东西
Java高级 类加载过程 加载(创建class对象) -> 连接(验证-准备-解析) -> 类初始化 类加载器类别 根类加载器:加载java核心类 扩展类加载器:加载JRE目录中的jar包 ...
- 使用Robot Framework框架远程操作UNIX系统
bot Framework是一个强大的自动化测试框架,依靠社区力量编写的Test Library为它提供了非常强的扩展性.下面我将介绍的就是如何使用第三方提供的扩展测试库(Test Library)来 ...
- [洛谷P4617] [COCI2017-2018#5] Planinarenje
Description \(Mirko\) 和 \(Slavko\) 喜欢一起去远足. \(Mirko\) 偏好攀登山峰,而 \(Slavko\) 偏爱山谷.因此每次他们登上一座山峰后,\(Slavk ...
- [bzoj2815] [洛谷P2597] [ZJOI2012] 灾难
Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过 ...