hiho 1079 離散化 線段樹

2021-07-05 15:20:27 字數 2221 閱讀 1685

給定乙個區間0~l,以及n條線段(li, ri),這n條線段按照輸入順序覆蓋到0~l區間。0問最後有幾條線段沒有被完全覆蓋?

算是線段樹的另一種使用,雖然標題是離散化,但其實是連續區間下使用線段樹。中間還有一些小問題要處理,就是線段樹的邊界問題。離散情況下,線段樹每乙個節點都代表乙個個體;連續情況下,每乙個節點代表乙個區間。也就是,left和right有微妙的變化,離散情況下left = [left, mid], right = [mid + 1, right]; 而連續情況下則是left = [left, mid], right = [mid, right],算是乙個小trick。

小ho提出的方法通俗易懂,由於輸入的區間太大,所以需要做乙個對映,把其中使用到的n對資料對映到0~2n之間,這樣就可以放心地用線段樹了。

不過我一開始想的是,不做對映,而是按需分區間。一開始就是乙個0~l的node,然後當有線段插入這個節點的時候,再去把這個節點分開。我這裡用的是二分,更快的方法可能是根據輸入的線段來分左右。

最後兩種方法都能ac,時間上也差不多。**如下:

對映方法:

//#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxprime = 1000000007;

class node

void add(int i, int l, int r)

if (same)

if (r <= mid)

else if (l >= mid)

else

} void count()

if (left) left->count();

if (right) right->count();

}};unordered_setnode::mark;

void pro()

vectorind = data;

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

auto it = unique(ind.begin(), ind.end());

ind.erase(it, ind.end());

mapmp;

n = ind.size();

for (int i = 0; i < n; ++i)

node *root = new node(0, n);

for (int i = 0; i < data.size(); i += 2)

root->count();

cout << node::mark.size() << endl;

}void handle()

int main()

按需劃分:

//#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxprime = 1000000007;

class node

void add(int i, int l, int r)

if (mid == -1)

if (id >= 0)

if (r <= mid)

else if (l >= mid)

else

id = -1;

} void count()

if (left) left->count();

if (right) right->count();

}};unordered_setnode::mark;

void pro()

root->count();

cout << node::mark.size() << endl;

}void handle()

int main()

hihoCoder1079 線段樹 離散化

線段樹 離散化 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述小hi和小ho在回國之後,重新過起了朝7晚5的學生生活,當然了,他們還是在一直學習著各種演算法 這天小hi和小ho所在的學校舉辦社團文化節,各大社團都在宣傳欄上貼起了海報,但是貼來貼去,有些海報就會被其他社...

hihoCoder 1079(線段樹 離散化)

題目大意 給n個區間,有的區間可能覆蓋掉其他區間,問沒有完全被其他區間覆蓋的區間有幾個?區間依次給出,如果有兩個區間完全一樣,則視為後面的覆蓋前面的。題目分析 區間可能很長,所以要將其離散化。但離散化之後區間就變成了連續的,不再是離散的。也就是葉子由左右端點為u u變成了左右端點為u 1 u,左右兒...

離散化 線段樹

題目 分析 每次1操作會往序列底加first個second,first 和 second 都是最大1e9的資料,每次2操作詢問序列中第first到第second個數的和 一開始就感覺有點像線段樹,輸入資料太大我們可以離線處理把資料離散化下,然後扔到線段樹上,維護兩個陣列 sum 區間數的值的和 nu...