problem 704: 陣列操作
time limit: 1000 ms memory limit: 262144 kb
problem description
給出n個陣列,每個陣列有li個整數,將陣列編號為1,2,3,…,n,然後給出m個數,每個數均為之前陣列的編號,將這些陣列按照給出的編號順序連線起來,形成新的陣列,比如:給出以下三個陣列[1,6,-2],[3,3],[-5,1],然後給出編號2 3 1 3,則新陣列為[3,3,-5,1,1,6,-2,-5,1],現在請問新陣列的最大連續子串行和是多少。
input
第一行兩個正整數n,m。
接下來n行,每行第乙個數為li,之後li個整數。
最後一行有m個正整數,表示連線陣列順序的編號。
【資料範圍】
對於10%的資料,形成的陣列長度不超過100000
對於100%的資料,1 <= n <= 50,1 <= li <= 5000,1 <= m <= 250000,每個陣列中的數絕對值在1000以內
output
一行乙個數,表示最大連續子串行和。
sample input
3 43 1 6 -2
2 3 3
2 -5 1
2 3 1 3
sample output
9[3,3,-5,1,1,6,-2,-5,1],紅色部分為最大和的連續子串行。
problem source
2017提高組聯賽訓練7.10
如果暴力的話只能拿三十分(親自試驗tle)
所以我們可以預處理處每個陣列的左區間和,最大連續子段和,右區間和,區間和
然後o(n)兩次動態規劃
然後每個區間統計答案即可
注:子段和至少要選取乙個元素,即如果詢問的區間全部都是負數,那麼輸出的答案為最小的那個負數的值
吐槽一下gfoj資料太弱,非負都a了
#include
#include
#include
#define n 60
#define m 250010
#define inf 9000000000000000000
using namespace std;
typedef long long ll;
int a[m],n,m,s;
ll ans,f[m][2],sum[n],sub[n],rma[n],lma[n],num;
int main()
num=0;
for(int j=s;j>=1;j--)
num=0;
for(int j=1;j<=s;j++)
// cout<' '
for(int i=1;i<=m;i++)f[i][0]=max(f[i-1][0]+sum[a[i]],rma[a[i]]);
for(int i=m;i>=1;i--)f[i][1]=max(f[i+1][1]+sum[a[i]],lma[a[i]]);
for(int i=0;i<=m;i++)ans=max(ans,max(sub[a[i]],f[i][0]+f[i+1][1]));
cout<}
陣列及陣列操作
c語言是在組合語言的基礎上就行的抽象,所以在理解c語言程式時,務必要以記憶體為基礎進行理解。關於陣列,只是同種型別資料的記憶體使用方式,除了在與指標連用時的語法比較繁瑣,其他都比較簡單。1 定義 初始化 使用 結合指標使用時,就要把它當做位址了 2 使用的情況 當儲存多個相同型別的資料時,可以使用陣...
ruby 陣列操作
陣列的建立 arr array.new num 建立num個元素的陣列,所有陣列元素為nil arr array.new num,elem 建立num個元素的陣列,所有陣列元素為elem arr array m.n 建立m.n元素為m到n的陣列 包括n m.n不包括n arr array elem1...
Jquery 陣列操作
在jquery中處理json陣列的情況中遍歷用到的比較多,但是用新增移除這些好像不是太多。今天試過json i remove json.remove i 之後都不行,看網頁的dom物件中好像json資料是以陣列的形式出現的,查閱了下相關js中陣列的操作一試果然很爽。記錄下來。1 陣列的建立 var ...