給定乙個區間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...