洛谷P2070 離散化區間

2022-06-01 07:27:07 字數 2085 閱讀 8594

『題目傳送門』:p2070 刷牆

『思路1 題解原鏈結』

farmer john已經設計了一種方法來裝飾穀倉旁邊的長柵欄(把柵欄認為是一根一維的線)。他把乙隻畫刷綁在他最喜愛的奶牛bessie身上,之後就去喝一杯冰水,而bessie隔著柵欄來回走,當她走過某個地方,這裡的一段柵欄就被刷上了塗料。

bessie從柵欄上的位置0開始,並且遵循著乙個n次移動的次序(1 <= n <= 100,000)。例如「10 l」表示bessie向左移動了10個單位長度,「15 r」表示bessie向右移動了15個單位長度。現給出bessie所有移動的列表,farmer john想要知道哪些區域的柵欄至少塗了兩層塗料(只塗一層塗料的區域可能在大雨中被洗掉)。bessie在她的行走中最遠到達距起始點1,000,000,000個單位長度。

題目大意:給定\(n\)個區間\([l,r]\)其中區間的長度\(1\leq l,r\leq 1e^9\),要求給出區間相交數大於2的區間長度。

例如模擬給定的樣例:

6

2 r6 l

1 r8 l

1 r2 r

說實話這個有點難弄清,需要細細的思考。

思路:從小到達掃瞄區間,維護乙個可能發生重疊的區間【l,r】,在當前維護的區間的右邊尋找乙個區間【a[i].l,a[i].r】

使得當前的可能區間更新:

分為兩種情況:(對應到圖右上角的1和2)

查詢的區間的右端點是小於當前維護區間的右端點的,那麼把【當前維護區間的左端點,當前查詢區間的右端點】這一區間加入到重複區間長度計算中。並且試圖在【當前查詢區間的右端點,當前維護區間的右端點】尋找下乙個可能的重複區間。

查詢的區間的右端點是大於當前維護區間的右端點的,那麼把【當前維護區間的左端點,當前維護區間的右端點】這一區間加入到重複區間長度計算中。並且試圖在【當前維護區間的右端點,當前查詢區間的右端點】尋找下乙個可能的重複區間

#include using namespace std;

typedef long long ll;

int n;

string dir;

ll l, r;

vector> alls;

ll res;

int main()

sort(alls.begin(), alls.end());

//找它區間後面左端點小於右端點並且右端點最右邊的點

ll lft = alls[0].first;

ll rgt = alls[0].second;

for (int i = 1; i < n; i++) else

}} cout << res << endl;

return 0;

}

對於乙個區間【l,r】每出現一次,就相當於在a[l]+=1,a[r+1]-=1;那麼就顯而易見的,直接對區間的左右端點左修改,\(m\)次查詢即完成了相應的修改,最後從小到大掃瞄所有的區間,若進入區間左端點後當前的差分值從1變為了2即開始進入到多個區間重合的區域,從2變到1即退出重合的區域。如下圖

離散化 洛谷1097

題目 某次科研調查時得到了nn個自然數,每個數均不超過1500000000 1.5 times 10 9 1500000000 1.5 109 已知不相同的數不超過1000010000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。include include i...

洛谷 P1908 逆序對(線段樹區間求和 離散化)

逆序對就是序列中 ai aj且i用乙個flag陣列標記哪些數字已經放入陣列中,用線段樹求flag的字首和,求放入的數字前已經放入了多少個比他小的數字。include using namespace std define int long long define ios ios sync with s...

洛谷 P1052 過河 dp 離散化

在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為ll的點表示橋的終點。青蛙從橋的...