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所 ...
随机推荐
- Excel如何快速选定指定区域
在日常办公中我们经常遇见需要选中指定的区域,这样选种比较快捷节省时间,要比用鼠标下拉要方便很多. 1.框选的是起始的位置(A1) 2.终止位置 3.这就是我们所要选中的区域例如(A1:H21) 总结: ...
- 浅谈Go类型转换之间的那些事
试着答一答这些问题 s[i]和(for _,v range)的v的区别是什么 var s string = "AB" fmt.Println(reflect.TypeOf(s[0] ...
- 手把手带你了解消息中间件(3)——RocketMQ
一.RocketMQ简介 RocketMQ作为一款纯java.分布式.队列模型的开源消息中间件,支持事务消息.顺序消息.批量消息.定时消息.消息回溯等. 二.RocketMQ架构 如图所示为R ...
- java实现FTP文件下载
package com.vingsoft.util;/*** @author 作者:dujj* @version 创建时间:2020年1月13日 下午5:53:39*/import java.io.F ...
- nginx介绍与安装
1.nginx作用可以配置数十个场景 2.环境安装 环境确认 安装环境 yum -y install gcc gcc-c++ autoconf pcre-devel make automa ...
- 异数OS TCP协议栈测试(一)--数据传输篇
异数OS TCP协议栈测试(一)--数据传输篇 本文来自异数OS社区 github: 异数OS-织梦师(消息中间件)群: 476260389 测试目标 数据传输IO性能测试,主要是建立连接后测试收 ...
- 高通量计算框架HTCondor(五)——分布计算
目录 1. 正文 1.1. 任务描述文件 1.2. 提交任务 1.3. 返回结果 2. 相关 1. 正文 1.1. 任务描述文件 前文提到过,HTCondor是通过condor_submit命令将提交 ...
- Oracle设置序列方法
create sequence SEQ_LoanApplicantGuarantee minvalue 1 nomaxvalue start with 1 increment by 1 nocycle ...
- 最新Pyecharts-基本图表
Pyecharts是由Echarts而来,Echarts是百度开源的数据可视化的库,适合用来做图表设计开发,当使用Python与Echarts结合时就产生了Pyecharts.可使用pip安装,默认是 ...
- Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例
这一节我们通过一个简单的实例,学习Sentinel的基本应用. 一.Sentinel 限流核心概念 在学习Sentinel的具体应用之前,我们先来了解一下Sentinel中两个核心的概念,资源和规则. ...