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,你能不能對於每乙個我給出的字串,都在這個詞典裡面找到以這個字串開頭的所...