1. 程式人生 > >牛客某題(DP+線段樹)

牛客某題(DP+線段樹)

都不造怎麼用簡短的語言表述題目來源了。。直接給傳送門把。。 (結尾處
這個很容易能夠得出dp方程的。。
d[i][j]={d[i1][j1]max{d[i][k]}k=1nj>0j==0
然而複雜度為o(n^2),還是會爆時間和空間的。。
對空間非常容易想到用滾動陣列。。
照這個思路順下去會發現,如果不考慮j==0的情況,d[i]是d[i-1]平移之後做了下區間減法,當然j>m的要去掉。。
所以為了寫起來方便把d[i]陣列整個置換過來,然後用線段樹維護,平移的時候並不需要真的把陣列整個平移,平移下標即可,然後再做區間加法,j==0的情況維護一下最大值就可以輕鬆解決。。

從dp到線段樹還是蠻好的這題。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,l,r) for(int i=l;i>=r;i--)
#define link(x) for(edge *j=h[x];j;j=j->next)
#define eps 1e-8
#define inf 1e9
#define mem(a) memset(a,0,sizeof(a))
#define ll long long
#define succ(x) (1<<x)
#define lowbit(x) (x&(-x))
#define sqr(x) ((x)*(x))
#define ls T[i<<1]
#define rs T[i<<1|1]
#define op T[i]
#define mid (x+y>>1)
#define NM 300005
#define nm 100498
#define pi 3.1415926535897931
using namespace std;
ll read(){
    ll x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return f*x;
}




int n,m,_x,_y,l,r,a[NM];
ll _t;
struct node{
	ll s,tag;int x,y;
	node*l,*r;
	node(int x,int y,node*l=0,node*r=0):tag(0),s(0),x(x),y(y),l(l),r(r){}
	void upd(){s=max(l->s,r->s);}
	void push(){if(l&&tag){l->tag+=tag;r->tag+=tag;l->s+=tag;r->s+=tag;tag=0;}}
	void mod(){
		if(_y<x||y<_x)return;
		if(_x<=x&&y<=_y){tag+=_t;s+=_t;return;}
		push();l->mod();r->mod();upd();
	}
	ll query(){
		if(_y<x||y<_x)return 0;
		if(_x<=x&&y<=_y)return s;
		push();return max(l->query(),r->query());
	}
}*root;

node*build(int x,int y){return x==y?new node(x,y):new node(x,y,build(x,mid),build(mid+1,y));}

int main(){
	//freopen("data.in","r",stdin);
	n=read();m=read();
	root=build(1,n+m+1);
	_x=l=1;_y=r=1;_t=read();root->mod();++r;
	inc(i,2,n){
		_x=l;_y=r;_t=root->query();
		_x=_y=++r;
		root->mod();
		if(r-l>m)_x=++l;else _x=l;_y=r-1;
		//printf("%d %d\n",_x,_y);
		_t=read();
		root->mod();
		//printf("%lld\n",root->s);
	}
	printf("%lld\n",root->s);
	return 0;
}

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld

題目描述

常州大學組織了新生寒假訓練一共N天,每天訓練可以獲得的訓練效果是Ei。但是如果連續訓練超過K天,萌新們會受不了而被勸退。 現在負責人想知道,如何安排能保證萌新不會被勸退並且能獲得最大的訓練效果。

輸入描述:

第一行:兩個用空格隔開的整數:N和K,1≤N≤100000,1≤K≤N
第二行到N+1行:第i+1行有一個整數,表示第N天的訓練效果是Ei,(0 <= Ei <= 1,000,000,000)

輸出描述:

第一行:單個整數,表示最大的能力之和
示例1

輸入

5 2 
1
2
3
4 
5

輸出

12

說明

(除了第三天以外每天都在訓練,總訓練效果為1+2+4+5=12)

備註:

1≤n≤100,000

相關推薦

(DP+線段)

都不造怎麼用簡短的語言表述題目來源了。。直接給傳送門把。。 (結尾處 這個很容易能夠得出dp方程的。。 d[i][j]={d[i−1][j−1]max{d[i][k]}k=1∼nj>0j==0 然而複雜度為o(n^2),還是會爆時間和空間的。。 對空間非常容易想

練習賽 資料結構 線段

連結:https://www.nowcoder.com/acm/contest/200/B 來源:牛客網   qn姐姐最好了~     qn姐姐給你了一個長度為n的序列還有m次操作讓你玩,     1 l r 詢問區間[l,r]內的元

網 中南林業科技大學第十一屆程序設計大賽J 二分+線段

main build query 。。 eof its include pan ID https://www.nowcoder.com/acm/contest/124#question 題意 找第一個不小於K的數的下標,然後對它前一個數加一 解析 我們可以維護一個最大

66(4)重建二叉

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 /** * Definition for binary

hdu 4719 Oh My Holy FFF(dp線段優化)

origin end should adding href ast left code padding Oh My Holy FFF Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65535/65535

Subsequence Count 2017ccpc網絡賽 1006 dp+線段維護矩陣

const 統計 轉換 inpu mic splay string pen one Problem Description Given a binary string S[1,...,N] (i.e. a sequence of 0‘s and 1‘s), and Q qu

【BZOJ4712】洪水 鏈剖分優化DP+線段

表示 他還 efi 父親 管理員 out 接下來 到你 head 【BZOJ4712】洪水 Description 小A走到一個山腳下,準備給自己造一個小屋。這時候,小A的朋友(op,又叫管理員)打開了創造模式,然後飛到山頂放了格水。於是小A面前出現了一個瀑布。作為

Codeforces 671D. Roads in Yusland(樹形DP+線段

pla too 不知道 ret 線上 tchar 起點 樹形 ads   調了半天居然還能是線段樹寫錯了,藥丸   這題大概是類似一個樹形DP的東西。設$dp[i]$為修完i這棵子樹的最小代價,假設當前點為$x$,但是轉移的時候我們不知道子節點到底有沒有一條越過$x$的路

練習賽11 B trie+拓撲判環 E 分治求平面最近點對

define ima 字典序 父親 name return 如果 int body 牛客練習賽11 B 假的字符串題意:給定n個字符串,互不相等,你可以任意指定字符之間的大小關系(即重定義字典序),求有多少個串可能成為字典序最小的串,並輸出它們。 tags:好題 對

[動態dp]線段維護轉移矩陣

sha info ++ 數組越界 基礎上 越界 矩陣 圖片 不用 背景:czy上課講了新知識,從未見到過,總結一下。 所謂動態dp,是在動態規劃的基礎上,需要維護一些修改操作的算法。 這類題目分為如下三個步驟:(都是對於常系數齊次遞推問題) 1先不考慮修改,不考慮區間

數串——

拼接 public 最大整數 sys tint 比較 ont min 16px 題目描述: 設有n個正整數,將他們連接成一排,組成一個最大的多位整數。 如:n=3時,3個整數13,312,343,連成的最大整數為34331213。 如:n=4時,4個整數7,13,4,2

句子反轉——(java)

++ () ring system for 字母 ext style scan 題目描述: 給定一個句子(只包含字母和空格), 將句子中的單詞位置反轉,單詞用空格分割, 單詞之間只有一個空格,前後沒有空格。 比如: (1) “hello xiao mi”-> “mi

POJ 3171 區間最小花費覆蓋 (DP+線段

cat scanf ron have -- sin 排列 resp lin Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4245 Accepted:

Princess Principal(思維|可用線段做)

alt -i 沒有 https cstring target 偶數 isp pre Princess Principal https://www.nowcoder.com/acm/contest/201/J 題目描述 阿爾比恩王國(the Albion Kingdom)潛

day04

描述: 輸入一個整數,將這個整數以字串的形式逆序輸出 程式不考慮負數的情況,若數字含有0,則逆序形式也含有0,如輸入為100,則輸出為001 import java.util.Scanner; public class Main { public static void main(

HDU - 4521 小明系列問題——小明序列 (dp + 線段)

題意 還是LIS,不過有一個限制條件是選擇的節點必須相差d。 思路 dp d p dp方程其實還是 dp[i] = max(dp[j]) +

luogu5010 HMR的LIS III (dp+線段)

-- 範圍 turn cond char || pac 開頭 離散化 這個東西和最長上升子序列很像 考慮如果已經知道每個位置為開頭的LIS長度和個數 f[i],我可以掃一遍 判斷這個個數和K的大小,找到第一個長度=len而且個數<K的,這個位置就是要選的 然後K-=

HDU 640 Taotao Picks Apples & FJUT3592 做完其他後才能做的線段)題解

題意(FJUT翻譯HDU): 錢陶陶家門前有一棵蘋果樹。 秋天來了,樹上的n個蘋果成熟了,淘淘會去採摘這些蘋果。 到園子裡摘蘋果時,淘淘將這些蘋果從第一個蘋果掃到最後一個。 如果當前的蘋果是第一個蘋果,或者它嚴格高於之前選擇的蘋果,那麼淘淘將採摘這個蘋果; 否則,他不會選擇。

66(8)跳臺階

一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。 假設有1階有1種方法; 假設有2階有2種方法; 假設有3階有(2,1),(1,2),(1,1,1)3種方法; 假設有4階(1,1,1,1)(2,1,1)(1,2,1