p1496 火燒赤壁
世界上只有一種英雄主義,就是認清了生活的本質後依然愛他。
----羅曼羅蘭
通往成功的道路上有很多挫折,這正是成功的意義所在。
----yxr
記今天下午上機退化成海淀區小學二年級水平。線性表不會,連簡單的矩陣乘法也不會。
-.-----------------------------正文--------------------------------
題意很好理解,求火燒過的長度。
簡單的做法是開乙個很大很大的陣列,有火為1,否則為0,數有多少個1就可以了。
顯然,會爆。
既然re,陣列又有大量的空間沒有存東西。「壓縮」一下,也就是離散化。
離散化三步走:
排序去重,用unique函式
二分查詢,用lower_bound函式
舉個栗子,如果初始輸入的num陣列為
num[6]=處理後的陣列為:
sum[5]=處理後的num陣列存的不是原來的數,而是這些數經過離散化處理後在sum中的位置。num[6]=
通過位置一樣也可以索取這些數的數值。
從num陣列獲取sum中的下標從而獲取資料解決問題。
關於unique和lower_bound:
sort
(num,num+length)
; length=
unique
(num,num+length)
-num;
unique和sort用法基本一致,第乙個為起始位置,最後乙個為結束位置+1。返回值為最後乙個元素位置+1的位址。由於返回的是容器末尾,所以如果想得到去重後的size,需要減去初始位址。
a[i]
=lower_bound
(c+1
,c+x,a[i]
)-c;
lower_bound,第乙個為起始位置,第二個為結束位置+1,最後乙個為要查詢的元素。返回值為第乙個大於等於值的位址。
對於此題,我們用乙個陣列flag判斷是否可以加上該點與後繼點的距離。num中的每一組資料對應的下標,從最左邊一直標記到最右邊減一。遍歷一遍sum,從左加到右即可。
文字描述太過蒼白。
舉個栗子:
-1 1在sum中為:2 95 11
-1 1 2 5 9 11*flag為:
1 0 1 1 1 0從左加到右即得:2+3+4+2=11
喜聞樂見的 **:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using
namespace std;
ll n,x=
1,ans=0;
ll a[
90100
],b[
90100];
ll c[
90100];
ll flag[
90100];
intmain()
sort
(c+1
,c+x)
;for
(i=1
;i<=n;i++
)for
(i=1
;i<=x;i++
) cout<}
洛谷 P1496 火燒赤壁
題目描述 曹操平定北方以後,公元208年,率領大軍南下,進攻劉表。他的人馬還沒有到荊州,劉表已經病死。他的兒子劉琮聽到曹軍聲勢浩大,嚇破了膽,先派人求降了。孫權任命周瑜為都督,撥給他三萬水軍,叫他同劉備協力抵抗曹操。隆冬的十一月,天氣突然回暖,颳起了東南風。沒想到東吳船隊離開北岸大約二里距離,前面十...
洛谷P1496 火燒赤壁
曹操平定北方以後,公元208年,率領大軍南下,進攻劉表。他的人馬還沒有到荊州,劉表已經病死。他的兒子劉琮聽到曹軍聲勢浩大,嚇破了膽,先派人求降了。孫權任命周瑜為都督,撥給他三萬水軍,叫他同劉備協力抵抗曹操。隆冬的十一月,天氣突然回暖,颳起了東南風。沒想到東吳船隊離開北岸大約二里距離,前面十條大船突然...
洛谷 P1496 火燒赤壁
曹操平定北方以後,公元208年,率領大軍南下,進攻劉表。他的人馬還沒有到荊州,劉表已經病死。他的兒子劉琮聽到曹軍聲勢浩大,嚇破了膽,先派人求降了。孫權任命周瑜為都督,撥給他三萬水軍,叫他同劉備協力抵抗曹操。隆冬的十一月,天氣突然回暖,颳起了東南風。沒想到東吳船隊離開北岸大約二里距離,前面十條大船突然...