牛客某題(DP+線段樹)
這個很容易能夠得出dp方程的。。
d[i][j]={d[i−1][j−1]max{d[i][k]}k=1∼nj>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)
輸出描述:
第一行:單個整數,表示最大的能力之和
輸入
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
牛客原題 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {
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