時空限制 1000ms / 128mb
題目描述
有一條奶牛衝出了圍欄,來到了一處聖地(對於奶牛來說),上面用牛語寫著一段文字。
現用漢語翻譯為:
有n個區間,每個區間x,y表示提供的x~y共y-x+1堆優質牧草。你可以選擇任意區間但不能有重複的部分。
對於奶牛來說,自然是吃的越多越好,然而奶牛智商有限,現在請你幫助他。
輸入格式:
第一行,n,如題
接下來n行,每行乙個數x,y,如題
輸出格式:
乙個數,最多能吃到的牧草堆數
說明
1<=n<=150000
0<=x<=y<=3000000
題目分析
先將所有草堆以右端點為第一關鍵字排序
d p[
i]
dp[i]
dp[i
]表示考慮前i
ii堆草能獲得的最大數量
那麼有dp轉移
d p[
i]=m
ax(d
p[i−
1],r
i−li
+1,m
ax(d
p[j]
+ri−
li+1
))(1
<=j
rj
)dp[i]=max(dp[i-1],\ r_i-l_i+1,\ max(dp[j]+r_i-l_i+1))(1<=jdp
[i]=
max(
dp[i
−1],
ri−
li+
1,ma
x(dp
[j]+
ri−
li+
1))(
1<=j
rj)
顯然dp[i
]dp[i]
dp[i
]一定是不下降的
若不存在j
jj滿足(
1<=j
rj
)(1<=j(1
<=j
rj)
,則d p[
i]=m
ax(d
p[i−
1],r
i−li
+1
)dp[i]=max(dp[i-1],\ r_i-l_i+1)
dp[i]=
max(
dp[i
−1],
ri−
li+
1)也就是要麼不選第i
ii堆,要麼只選第iii堆
而如果存在這樣的j
jj直接列舉j
jj去更新是o(n
2)
o(n^2)
o(n2
)的,肯定t
但注意到dp[
i]
dp[i]
dp[i
]的不下降性
所以直接二分尋找滿足1
<=j
<
i1<=j
1<=j
<
i且離i
ii最近的j
jj即可
#include
#include
#include
#include
#include
#include
using
namespace std;
intread()
while
(ss>=
'0'&&ss<=
'9')
return f*x;
}const
int maxn=
200010
;int n;
struct noderem[maxn]
;bool
cmp(node a,node b)
int dp[maxn]
;int
find
(int x)
return ans;
}int
main()
printf
("%d"
,dp[n]);
return0;
}
洛谷P1868 飢餓的奶牛
有一條奶牛衝出了圍欄,來到了一處聖地 對於奶牛來說 上面用牛語寫著一段文字。現用漢語翻譯為 有n個區間,每個區間x,y表示提供的x y共y x 1堆優質牧草。你可以選擇任意區間但不能有重複的部分。對於奶牛來說,自然是吃的越多越好,然而奶牛智商有限,現在請你幫助他。輸入格式 第一行,n,如題 接下來n...
P1868 飢餓的奶牛
有一條奶牛衝出了圍欄,來到了一處聖地 對於奶牛來說 上面用牛語寫著一段文字。現用漢語翻譯為 有n個區間,每個區間x,y表示提供的x y共y x 1堆優質牧草。你可以選擇任意區間但不能有重複的部分。對於奶牛來說,自然是吃的越多越好,然而奶牛智商有限,現在請你幫助他。輸入格式 第一行,n,如題 接下來n...
線性動態規劃之 P1868 飢餓的奶牛 打卡打卡!
洛谷鏈結點這裡 好了,這是我找二分例題的時候刷到的,我也不知道為什麼會出來dp區間和 ok,現在一步步來分析題目 第一步,我要處理輸入的資料,假設我有這麼幾段區間,16,20 18,20 19,20 和 1,5 2,5 3,5 4,5 和 8,11 9,11 10,11 那麼你打算怎麼處理它呢?我的...