線段樹3(離散化,連續區間)

2021-07-15 22:25:45 字數 1446 閱讀 3286

題目是依次按給定的範圍貼海報,問覆蓋到最後還能看到幾張海報。

因為給定的貼海報的板子總長度為10^9,陣列開不下。但是考慮到海報只有10^5張,而整個問題其實課忽略板子長度,只需要考慮每張海報之間的覆蓋關係就可以了,也就是說

(1,1000008)(3,9990)(10,20000000)這三個區間的覆蓋情況完全可化成(1,5)(2,4)(3,6),也就是只需要把出現的所有位置進行 排序,把數字轉換成對應的序數,這樣陣列最大 就只需要2*10^5這麼大了。另外乙個要注意的地方就是海報在區間是連續的,所以節點的意思要改變一下,比如節點左右區間為3和5,離散的區間意思就是3,4,5,這三個點,而連續的區間就是表示(3,5]這段。這樣的區別在操作過程中主要體現在結束不再是l==r而應該是r - l <=1,區間分半也不再是(l,m)和(m+1,r)而是(l,m)和(m,r)。

#include

#include

#include

#include

#include

#include

#include

#include

#define mod 1000000007;

using namespace std;

struct  node

node()

bool lazy;

};node ltree[800005];

int z[200005];

int n, q ,num;

sets;

mapm;

void creata(int now,int l,int r)

int m = (l + r >> 1);

creata(now * 2, l, m);

creata(now * 2 + 1, m, r);

return;

}void find(int now,int l, int r,int v)

int m = (ltree[now].l + ltree[now].r >> 1);

if (ltree[now].lazy)

if (r <= m)

else if (l >= m)

else

}void dfs(int now)

if (ltree[now].lazy)

dfs(now * 2);

dfs(now * 2 + 1);

}int main()

num = 0;

for (set::iterator it = s.begin(); it != s.end(); ++it)

creata(1, 1, num);

s.clear();

for (int i = 1; i <= 2 * n; i = i + 2)

dfs(1);

printf("%d\n", s.size());

}return 0;

}

線段樹維護連續區間

在抗日戰爭期間,華北平原廣大地區進行了大規模的隧道戰。一般來說,通過隧道連線的村莊排成一列。除了兩端,每個村莊都與兩個相鄰的村莊直接相連。入侵者經常對一些村莊發動襲擊並摧毀其中的部分隧道。八路軍指揮官要求最新的隧道和村莊連線狀態。如果某些村莊嚴重隔離,必須立即恢復連線!input 輸入的第一行包含兩...

線段樹區間合併 連續區間問題

hdu 1540 資料很奇葩。用討論區裡面的話形容這題很合適 九九八十一難,這道題比北大的資料真是坑出翔來了 poj 2892 原題 一摸一樣 題意 給定n個村莊排成一行,它們相鄰的村莊通過地道相連,有三種操作 1 炸毀第x個村莊 2 修復上乙個被炸毀的村莊 3 詢問 輸出 第x個村莊還能和幾個村莊...

連續區間計數 線段樹, 單調棧

乙個區間合法當且僅當 max v m in v r lmax v m in v r l,移項得 min v max v r l m in v ma x v r l 可以想到列舉 min v a i m in v a i 記錄左邊第乙個比 i i 小的位置和右邊第乙個比 i i 小的位置,分別記為 l...