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所 ...
随机推荐
- Linux学习_菜鸟教程_1
Linux系统启动过程:内核的引导 .运行init.系统初始化.建立终端.用户登录系统 内核引导:计算机开机,然后BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动. 操作系统接管硬件 ...
- git版本管理工具(二)
1.查看历史版本 ·git log ·git reflog 2.版本回退 ·git reset --hard HEAD^(HEAD代表当前版本) ·HEAD^代表回退到上一个版本 以此类推 ·HEAD ...
- javascript 实现中文按照拼音首字母排序
js提供了sort()方法来对数组内的数据进行排序,但是只是对英文有作用,这个时候需要自定义排序的规则 ['张三','李四','王五'].sort((a, b) => a.localeCompa ...
- MapGIS注记文字无损转入ArcGIS软件
在GIS软件中,注释是一种十分特殊的对象,虽然各类软件都支持注释,但它却不属于GIS的基本对象.因此通常的格式转换软件,都不对注释对象做特别的支持,我们最常见的Shape文件格式就只有点.线.面要素, ...
- JS的var和let的区别(详细讲解)
let是ES6新增的,它主要是弥补var的缺陷,你也可以把let看做var的升级版.下面我就来详细讲讲var和let的区别 相同点: var和let都有函数级作用域 不同点: (1)var是全局作用域 ...
- 【PCIE-4】---PCIE中部分概念或问题总结(很基础很重要)
前面三小节,介绍了PCIE的基本知识和概念,以及扫描流程.在不求甚解的情况下,我想各位小伙伴应该对PCIE有了个宏观的认识,OK,那么本章我们在之前的基础上,再单独把一些概念和更深层次的问题摘出来具体 ...
- hdu6601 主席树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6601 Problem Description N sticks are arranged in a r ...
- Spring-cloud微服务实战【六】:接口服务feign
在上一篇文章中,我们使用了ribbon进行负载均衡,但是仔细思考一下,我们的请求封装和调用以及结果的返回都是我们自己编码完成的,如果需要调用的接口很多,那么无疑开发量是比较大的,那有没有比较好的方式呢 ...
- Django SQLite3的使用
https://blog.csdn.net/qq_34485436/article/details/72805908
- [洛谷P2962] [USACO09NOV] 灯Lights
Description Bessie and the cows were playing games in the barn, but the power was reset and the ligh ...