區間問題 hiho一下第152周 區間求差

2021-08-02 00:13:16 字數 1997 閱讀 1297

hiho一下第152周 - 區間求差

時間限制:

10000ms

單點時限:

1000ms

記憶體限制:

256mb

給定兩個區間集合 a 和 b,其中集合 a 包含 n 個區間[ a1

, a2

], [ a3

, a4

], ..., [ a2n-1

, a2n

],集合 b 包含 m 個區間[ b1

, b2

], [ b3

, b4

], ..., [ b2m-1

, b2m

]。求 a - b 的長度。

例如對於 a = , b = , a - b = ,長度為8。

第一行:包含兩個整數 n 和 m (1 ≤ n, m ≤ 100000)。

第二行:包含 2n 個整數 a1

, a2

, ..., a2n

(1 ≤ ai

≤ 100000000)。

第三行:包含 2m 個整數 b1

, b2

, ..., b2m

(1 ≤= bi

≤ 100000000)。

乙個整數,代表 a - b 的長度。

樣例輸入

3 2

2 5 4 10 14 18

1 3 8 15

樣例輸出

8
思路分析:

一般區間問題:

對於由2n個點所構成的n個區間,用綠色表示區間左端點,藍色表示右端點。將所有的點放入容器中並按公升序排序,設定計數變數cnt標記當前位置由幾個區間所包含,然後從小到大依次遍歷2n個點,如果是左端點則cnt++,右端點則cnt--。計算出每一段所屬區間的個數(cnt)就可以做很多事情,比如要求多個區間並集的長度,只要求出所有cnt大於0的線段的長度和即可。另外,還可以求出被覆蓋最多次的線段(cnt的最大值)等等。值得注意的是,對於重合的點的處理可能需要仔細考慮,而本題中無需考慮,可將重合的點看成多個重疊的長度為0的線段,並不影響我們的計算結果。

回到本題,要計算a - b的長度,就要先考慮好哪些點是屬於a - b這個集合的,存在什麼樣的特徵。我們可以將a, b集合中的左右端點分別用四種標記來標識,放到容器中然後從小到大排序。設定變數cnta與cntb分別對集合a與集合b進行計數,即當前點為集合a的左端點時cnta++,為集合a右端點時,cnta--。集合b中的點同理。顯然,a - b等價於所有滿足cnta > 0且cntb=0的線段。

/***********************

[hihocoder] 第152周 - 區間求差

author:*********long

time:2017/6/01 15:04

language:c++

***********************/

#include "stdafx.h"

#include #include #include using namespace std;

int a[200005]=, b[200005]=;

bool compare(pairp1, pairp2)

for(int i=0; i<2*m; i++)

sort(pset.begin(), pset.end(), compare);

int cnta=0, cntb=0, ans=0;

for(int i=0; icpair = pset[i];

switch(cpair.first)

if(cnta>0 && cntb==0)

ans += (pset[i+1].second - pset[i].second);

} cout<

hiho一下第143周

題目1 hiho密碼 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述 小ho根據最近在密碼學課上學習到的知識,開發出了一款hiho密碼,這款密碼的秘鑰是這樣生成的 對於一種有n個字母的語言,選擇乙個長度為m的單詞 將組成這個單詞的所有字母按照順序不重複的寫出 即遇到相...

hiho一下 第197周 逆序單詞

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 在英文中有很多逆序的單詞,比如dog和god,evil和live等等。現在給出乙份包含n個單詞的單詞表,其中每個單詞只出現一次,請你找出其中有多少對逆序單詞。第1行 1個整數,n,表示單詞數量。2 n 50,000。第2.n ...

hiho一下 第二週

題目名稱 trie樹 小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一本詞典,於是小hi就向小ho提出了那個經典的問題 小ho,你能不能對於每乙個我給出的字串,都在這個詞典裡面找到以這個字串開頭的所...