P1496 火燒赤壁

2021-10-01 04:28:50 字數 1812 閱讀 1267

用離散化,區間問題。

當然,可以用模擬,但是資料強一點,模擬就不過了!

1.用陣列x儲存所有起點和終點。

2.對x進行公升序排序。

3.用unique()對x進行去重。

4.進行標記,遍歷所有的起點和終點,找它們在離散陣列x中排在第幾位。

技巧:add陣列,標記了離散陣列x,用於區別起點和終點。並用於標記區間是否需要加上。

#pragma gcc optimize(3,"ofast","inline")

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define f(i,s,t) for(int i=(s);i<=(t);i++)

#define d(i,s,t) for(int i=(s);i>=(t);i--)

#define dbug(i) printf("value=%d\n",i)

#define ddbug(i,j) printf("value=%d %d\n",i,j)

#define ed putchar('\n')

#define fo freopen("d:\\in.txt","r",stdin)

#define ios cin.tie(0) ,cout.tie(0), cout.sync_with_stdio(0)

typedef

long

long ll;

//const int inf = 1 << 30;

//const double eps = 1e-6;

//#define mx 205

//#define mod 10000

using

namespace std;

int a[

20002

], b[

20002

], add[

40005

], x[

40005];

//離散化用到的變數

int n,

cnt(1)

;int

main()

//得到的cnt實際上比原本的大一了

sort

(x +

1, x + cnt)

; cnt =

unique

(x +

1, x + cnt)

- x -1;

//cnt為最終離散陣列的位數

//下面開始搞標記陣列。

f(i,

1, n)

//然後設add陣列,通過表識陣列,也叫索引陣列

f(i,

1, n)

intsum(0

),temp(0

);//答案,戰船的總長度

f(i,

1, cnt)

cout << sum << endl;

return0;

}

進一步解析程式阿。

因為要分起點和終點,所以用了陣列a和陣列b。

可是,離散化說乙個一維陣列阿??

那就用陣列x來儲存所有點,後進行離散化。

完成後,就要用二分查詢來搞標識陣列(使原序列與離散陣列對應)。

最後是add陣列,用簡單的數字來模擬了區間。

題解 P1496 火燒赤壁

蒟蒻的第一篇題解,其實這道題是標準的離散化,模擬可以過,但是就沒有訓練效果了。我們首先先看資料,n 20000,資料不多,但是範圍大 10 9 ai,bi 10 9 這時,就可以用離散化了,我們先定義兩個陣列,記錄座標,再全部賦給乙個新的陣列,進行排序,就可以判斷是否可用 flag判斷 再通過乙個f...

洛谷 P1496 火燒赤壁

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

洛谷P1496 火燒赤壁

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