Codeforces 1304F2 Animal Observation (hard version) 代码(dp滑动窗口线段树区间更新优化)
https://codeforces.com/contest/1304/problem/F2
#include<bits/stdc++.h>
using namespace std;
const int maxn = 4e4+;
int dp[][maxn];
int val[][maxn];
int sum[][maxn];
int n,m,k;
struct node{
int l,r;
int Max,lz;
}seg_t[maxn*];
void build(int l,int r,int p){
seg_t[p].l = l,seg_t[p].r = r;
if(l == r) {
seg_t[p].Max = ;return ;
}
int mid = (l+r)>>;
build(l,mid,p*);
build(mid+,r,p*+);
seg_t[p].Max = max(seg_t[p*].Max ,seg_t[p*+].Max );
}
void pushdown(int k){
seg_t[k*].lz +=seg_t[k].lz ;
seg_t[k*+].lz +=seg_t[k].lz ;
seg_t[k*].Max +=seg_t[k].lz ;
seg_t[k*+].Max +=seg_t[k].lz ;
seg_t[k].lz = ;
}
void upd(int L,int R,int p,int v){
if(seg_t[p].l == L && seg_t[p].r == R){
seg_t[p].lz +=v;
seg_t[p].Max +=v;
return;
}
if(seg_t[p].lz ) pushdown(p);
int mid = (seg_t[p].l + seg_t[p].r )>>;
if(R<=mid) upd(L,R,p*,v);
else if(L>mid) upd(L,R,p*+,v);
else{
upd(L,mid,p*,v);
upd(mid+,R,p*+,v);
}
seg_t[p].Max = max(seg_t[p*].Max ,seg_t[p*+].Max );
}
int query(int p,int L,int R){
if(seg_t[p].l == L && seg_t[p].r == R) return seg_t[p].Max ;
if(seg_t[p].lz ) pushdown(p);
int mid = (seg_t[p].l +seg_t[p].r)>>;
if(R<=mid) return query(p*,L,R);
else if(L>mid) return query(p*+,L,R);
else return max(query(p*,L,mid),query(p*+,mid+,R));
}
int main(){
cin>>n>>m>>k;
for(int i = ;i<=n;i++){
for(int j = ;j<=m;j++) {
cin>>val[i][j];
sum[i][j] = sum[i][j-] + val[i][j];
}
}
for(int i = ;i<=m-k+;i++){
dp[][i] = sum[][i+k-] - sum[][i-]+sum[][i+k-]-sum[][i-];
}
for(int i = ;i<=n;i++){
memset(seg_t,,sizeof(seg_t));
build(,*m,);
for(int j = ;j<=m;j++) upd(j,j,,dp[i-][j]);
for(int j = ;j<=k;j++) upd(,j,,-val[i][j]);
for(int j = ;j<=m-k+;j++){
dp[i][j] = max(dp[i][j],query(,,m)+sum[i][j+k-]-sum[i][j-]+sum[i+][j+k-]-sum[i+][j-]);
upd(max(,j-k+),j,,val[i][j]);
upd(j+,j+k,,-val[i][j+k]);
}
}
int ans = ;
for(int i = ;i<=m;i++) ans = max(ans,dp[n][i]);
cout<<ans;
return ;
}
Codeforces 1304F2 Animal Observation (hard version) 代码(dp滑动窗口线段树区间更新优化)的更多相关文章
- 1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP
1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP 题意 用摄像机观察动物,有两个摄像机,一个可以放在奇数天,一个可以放在偶数天.摄像机在 ...
- Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸
D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...
- codeforces 482B. Interesting Array【线段树区间更新】
题目:codeforces 482B. Interesting Array 题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val. 就是区间l---r上的与的值为val,最后问你原来的数 ...
- 线段树区间合并优化dp——cf1197E(好)
线段树优化dp的常见套路题,就是先按某个参数排序,然后按这个下标建立线段树,再去优化dp 本题由于要维护两个数据:最小值和对应的方案数,所以用线段树区间合并 /* dp[i]表示第i个套娃作为最内层的 ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)
题目大意: 让每天都能吃到西瓜. 最少须要花多少钱. 思路分析: dp[pos] 就表示 要让 前i天每天都有西瓜吃.最少须要花多少钱. 那么假设你买这个西瓜的话. 那么这个西瓜能吃的持续时间都要更 ...
- Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间求和+点修改+区间取模
D. The Child and Sequence At the children's day, the child came to Picks's house, and messed his h ...
- Codeforces 719E [斐波那契区间操作][矩阵快速幂][线段树区间更新]
/* 题意:给定一个长度为n的序列a. 两种操作: 1.给定区间l r 加上某个数x. 2.查询区间l r sigma(fib(ai)) fib代表斐波那契数列. 思路: 1.矩阵操作,由矩阵快速幂求 ...
- Codeforces 482B Interesting Array(线段树区间更新)
题目链接 Interesting Array 区间更新.然后对于每一个约数重新求一遍区间的&值,不符合就跳出. #include <bits/stdc++.h> using nam ...
随机推荐
- pytorch之 batch_train
import torch import torch.utils.data as Data torch.manual_seed(1) # reproducible BATCH_SIZE = 5 # BA ...
- C语言结构体定义位域,从bit0开始,依次到最高bit位
位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据 ...
- 《自拍教程29》Sublime_小脚本编写首选
Sublime Sublime 是一个轻量.简洁.高效.跨平台的编辑器, 最新的是Sublime Text 3. Sublime对Python支持非常好,如果只是简单的编写批处理脚本编写, 或者小范围 ...
- GNU make doc - 6.6 追加变量值
有时我们需要对已经定义过的变量进行追加,可以使用+=进行这一操作,就像下面这样 objects += another.o 该语句取objects变量的值,并在其后追加another.o(结果会在原变量 ...
- Oracle Linux下安装Oracle11gR2
Linux上Oracle11g R2安装及配置 一. 安装环境准备 1. 环境说明 Linux服务器系统:Oracle Linux Release 6 Update 2 (64bit),先安装好. ...
- CSS中的圣杯布局与双飞翼布局
一,圣杯布局 1,什么是圣杯布局? 所谓圣杯布局就是用于实现一个两侧宽度固定,中间宽度自适应的三栏布局 2,构建圣杯布局的步骤: 2.1,添加一个容器,在这个容器中添加放三个盒子(左.中.右): 2. ...
- mysql必知必会--创建计算字段
计算字段 存储在数据库表中的数据一般不是应用程序所需要的格式.下面举 几个例子. * 如果想在一个字段中既显示公司名,又显示公司的地址,但这两 个信息一般包含在不同的表列中. * 城市.州和邮政编码存 ...
- Edge Chromium 中如何始终允许运行 Flash 内容
众所周知,由于 Adobe Flash 控件历史久远,积累了许多漏洞.早在2017年7月,Adobe就宣布了要在2020年底终止对 Flash 的支持.微软称其浏览器移除 Flash 插件的最后期限是 ...
- 论AMD内核如何使用Android Studio虚拟机
其实之前和老师求证过AMD内核要用虚拟机的话应求助第三方模拟器(不然速度太慢)或直接使用真机测试,当时拿着虚拟机的报错简单搜索了下只翻到了一个用谷歌第三方工具的(检索时关键词不对的锅),觉得麻烦就没去 ...
- 重构与动态为angularjs栏位赋值或获取值
先来看下面一段html: 这个ng-model名称带有一定的规律带有序号. 先来实现数据绑定,从数据取到数据后,为ng-model绑定相对应的值: var c = response.data $sco ...