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 + 线段树)的更多相关文章

  1. 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. ...

  2. 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 ...

  3. 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 ...

  4. Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)

    题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...

  5. 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. 这题 ...

  6. 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 ...

  7. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

  8. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  9. 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所 ...

随机推荐

  1. ruby 编写控制台进度条

    ruby 中,$stdout.flush 让控制台当前行内容可以重写,以此我们可以做出进度条的效果. def set_progress(index, char = '*') print (char * ...

  2. 16.用pycharm导入自己写的模块时,import无法识别的解决办法

    我们用pycharm打开自己写的代码,当多个文件之间有相互依赖的关系的时候,import无法识别自己写的文件,但是我们写的文件又确实在同一个文件夹中, 这种问题可以用下面的方法解决: 1)打开File ...

  3. VMware上安装Kali Linux 超详细教程

    一.下载镜像文件 下载好系统对应镜像文件  https://www.kali.org/downloads/ 二.创建新的虚拟机 1.创建新的虚拟机 我们使用自定义的配置方法. 2.添加镜像文件的路径 ...

  4. 【转】SQL语句面试题

    1.一道SQL语句面试题,关于group by表内容:2005-05-09 胜2005-05-09 胜2005-05-09 负2005-05-09 负2005-05-10 胜2005-05-10 负2 ...

  5. Java8 新特性(二)- Stream

    Stream 用来处理集合数据的,通过 stream 操作可以实现 SQL 的拥有的大部分查询功能 Java8 API 官方文档 下面借助例子,演示 stream 操作 Java userList 列 ...

  6. MOS 常用链接地址

    主页面类  Exadata主页面 Exadata Database Machine and Exadata Storage Server Supported Versions (Doc ID 8888 ...

  7. oa办公系统是什么?对企业有什么作用?

    OA办公系统是指利用计算机网络帮助企业实现办公自动化,用系统软件代替传统的手工工作帮助企业处理内部事务,例如文档共享.部门协作.报销.业务流程等等,最终目的帮助企业提高工作效率,实现利益最大化. 随着 ...

  8. spring boot 的 userRepository无法注入的问题

    No qualifying bean of type 'xxx.xxx.xxx' available: expected at least 1 bean which qualifies as auto ...

  9. 聊一聊 MySQL 数据库中的那些锁

    在软件开发中,程序在高并发的情况下,为了保证一致性或者说安全性,我们通常都会通过加锁的方式来解决,在 MySQL 数据库中同样有这样的问题,一方面为了最大程度的利用数据库的并发访问,另一方面又需要保证 ...

  10. cssSelector定位写法大全(适用于selenium、robotframework)

    1.定位weibo登录框 输入框的元素信息如下 css的写法(可以看到name属性的属性值是“username”,class属性的值“W_input" driver.findElement( ...