CF#67 75d Big Maximum Sum
题解:
观察到拼接后的数据范围过大,无法O(n)解决,但是大区间是由很多小区间组成,而小区间是固定的,不会变化,所以可以考虑预处理出每个小区间的信息,然后根据给定序列按顺序一步一步合并区间信息。
跟线段树维护区间最大子段和类似,要合并2个区间我们只需要知道如下信息:
前缀最大子段和,后缀最大子段和,当前区间最大子段和。
那么转移方式如下:
1,对于区间最大子段和而言,要么是继承2个区间中的某个最大子段和,要么是用上一个区间的后缀最大子段和+后一个区间的前缀最大子段和凑成一个子段和作为新的最大子段和,所以3者取max即可。
2,对于前缀最大值而言,,,其实我们在转移的时候并不需要用到上一个区间的前缀最大值,因此无需再次维护。
3,对于后缀最大值而言,要么是继承后一个区间的后缀最大子段和,要么是上一个区间的后缀最大值+后一个区间的整个区间凑成的新后缀最大值,2者取max即可。
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 50
#define ac 5000
#define LL long long int n, m, len;
LL l[AC], r[AC], mx[AC], sum[AC], ans, rr;
int s[ac]; inline int read()
{
int x = ;char c = getchar();bool z = false;
while(c > '' || c < '')
{
if(c == '-') z = true;
c = getchar();
}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
if(!z) return x;
else return -x;
} inline void upmax(LL &a, LL b)
{
if(b > a) a = b;
} void pre()
{
n = read(), m = read();
for(R i = ; i <= n; i ++)
{
len = read();
for(R j = ; j <= len; j ++) s[j] = read(), sum[i] += s[j];
LL tmp = ;
for(R j = ; j <= len; j ++) tmp += s[j], upmax(l[i], tmp);
tmp = ;
for(R j = len; j; j --) tmp += s[j], upmax(r[i], tmp);
tmp = ;
for(R j = ; j <= len; j ++)
{
tmp += s[j];
upmax(mx[i], tmp);
if(tmp < ) tmp = ;
}
}
} void work()
{
int x;
x = read();
rr = r[x], ans = mx[x];
for(R i = ; i <= m; i ++)
{
x = read();//读入右区间
upmax(ans, mx[x]);
upmax(ans, rr + l[x]);
rr = rr + sum[x];
upmax(rr, r[x]);
}
cout << ans << endl;
} int main()
{
//freopen("in.in", "r", stdin);
pre();
work();
//fclose(stdin);
return ;
}
CF#67 75d Big Maximum Sum的更多相关文章
- cf#513  B. Maximum Sum of Digits
		B. Maximum Sum of Digits time limit per test 2 seconds memory limit per test 512 megabytes input sta ... 
- CF 276C Little Girl and Maximum Sum【贪心+差分】
		C. Little Girl and Maximum Sum time limit per test2 seconds memory limit per test256 megabytes input ... 
- POJ2479 Maximum sum[DP|最大子段和]
		Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39599 Accepted: 12370 Des ... 
- ural 1146. Maximum Sum
		1146. Maximum Sum Time limit: 0.5 secondMemory limit: 64 MB Given a 2-dimensional array of positive ... 
- UVa 108 - Maximum Sum(最大连续子序列)
		题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ... 
- 最大子矩阵和 URAL 1146 Maximum Sum
		题目传送门 /* 最大子矩阵和:把二维降到一维,即把列压缩:然后看是否满足最大连续子序列: 好像之前做过,没印象了,看来做过的题目要经常看看:) */ #include <cstdio> ... 
- URAL 1146 Maximum Sum(最大子矩阵的和 DP)
		Maximum Sum 大意:给你一个n*n的矩阵,求最大的子矩阵的和是多少. 思路:最開始我想的是预处理矩阵,遍历子矩阵的端点,发现复杂度是O(n^4).就不知道该怎么办了.问了一下,是压缩矩阵,转 ... 
- ural  1146. Maximum Sum(动态规划)
		1146. Maximum Sum Time limit: 1.0 second Memory limit: 64 MB Given a 2-dimensional array of positive ... 
- UVa 10827 - Maximum sum on a torus
		题目大意:UVa 108 - Maximum Sum的加强版,求最大子矩阵和,不过矩阵是可以循环的,矩阵到结尾时可以循环到开头.开始听纠结的,想着难道要分情况讨论吗?!就去网上搜,看到可以通过补全进行 ... 
随机推荐
- springBoot -webSocket 基于STOMP协议交互
			浅谈WebSocket WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就可以建立一条快速通道,两者就可以实现数据互传了.说白了,就是打破了 ... 
- Android7.0 应用内升级
			Android7.0应用内升级 最近线上项目在7.0机器上出现应用内升级失败,原来是由于Android7.0权限问题导致. 如果项目的 targetSdkVersion>=24 在处理应用内升级 ... 
- Win10 远程服务器版
			朋友的电脑刚装了1803版的Win10,然后他用KMS_VL_ALL6.9激活了一下,竟然变成了一个奇怪的版本:“远程服务器版”!第一次见这玩意,还真稀罕.帮他研究了一下,发现KMS_VL_ALL在激 ... 
- 第四篇 与Flask相关的插件(flask-session、wtforms)
			公司中使用SQL的种方式: 1. 写Django:ORM(关系对象映射), 2. 写Flask和其他:有两种方式: (1) 原生SQL:使用原生SQL有两种选择: A. pymysql (python ... 
- ORACLE高级部分内容
			1.pl/sql基本语句 DECLARE BEGIN END; / 循环语句 DECLARE I NUMBER(2):=1; BEGIN WHILE I<100 LOOP I:=I+1; EN ... 
- php 连接redis查询数据
			class Layoutdemo{ function index(){ $db = new Db(); $id=390; $layout_json = array(); if($info = $db- ... 
- Python中__name__属性的妙用
			在Python中,每一个module文件都有一个built-in属性:__name__,这个__name__有如下特点: 1 如果这个module文件是被别的文件导入的,那么,该__name__属性的 ... 
- Android UI 设计之 TextView EditText 组件属性方法最详细解析
			. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ... 
- Coursera-Note: Internet History, Technology and Secure (1st week to 9th week)
			目录 Coursera-Note: Internet History, Technology and Secure 第一周 第二周 数据交换: Packet switching技术: 第三周 创造ht ... 
- Java中I/O流之Object流
			Java 中的 object 流:直接将 Object 对象写入或读出 1. serializable 接口:序列化,可以被序列化的,若确实需要将某个类的对象写在硬盘上或网络上,想把他们序列化成一个字 ... 
