洛谷 P1496 火燒赤壁(離散化

2021-10-09 19:06:06 字數 2145 閱讀 9134

p1496 火燒赤壁

世界上只有一種英雄主義,就是認清了生活的本質後依然愛他。

----羅曼羅蘭

通往成功的道路上有很多挫折,這正是成功的意義所在。

----yxr

記今天下午上機退化成海淀區小學二年級水平。線性表不會,連簡單的矩陣乘法也不會。

-.-----------------------------正文--------------------------------

題意很好理解,求火燒過的長度。

簡單的做法是開乙個很大很大的陣列,有火為1,否則為0,數有多少個1就可以了。

顯然,會爆。

既然re,陣列又有大量的空間沒有存東西。「壓縮」一下,也就是離散化。

離散化三步走:

排序去重,用unique函式

二分查詢,用lower_bound函式

舉個栗子,如果初始輸入的num陣列為

num[6]=

處理後的陣列為:

sum[5]=

num[6]=

處理後的num陣列存的不是原來的數,而是這些數經過離散化處理後在sum中的位置。

通過位置一樣也可以索取這些數的數值。

從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

2 95 11

在sum中為:

-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年,率領大軍南下,進攻劉表。他的人馬還沒有到荊州,劉表已經病死。他的兒子劉琮聽到曹軍聲勢浩大,嚇破了膽,先派人求降了。孫權任命周瑜為都督,撥給他三萬水軍,叫他同劉備協力抵抗曹操。隆冬的十一月,天氣突然回暖,颳起了東南風。沒想到東吳船隊離開北岸大約二里距離,前面十條大船突然...