Mayor s posters(線段樹 離散化)

2022-08-21 03:51:14 字數 1433 閱讀 5685

這道題最關鍵的點就在離散化吧。

假如有三張海報[1, 10] [10, 13][15,  20] 僅僅三個區間就得占用到20了。

但是離散化後就可以是[1, 2] [2, 3] [4, 5] n到1e4 不重疊的話最大也只到2e4

那麼就可以做了

離散化技巧需要好好消化

**如下

#include #include 

#include

#include

#define lp p<<1

#define rp p<<1|1

using

namespace

std;

const

int n = 20000+5

;int tree[n<<2

];int

a[n], ans;

bool

vis[n];

pair

p[n];

inline

void pushdown(int

p) }

void build(int p, int l, int

r)

return

; }

int mid = l + r >> 1

; build(lp, l, mid);

build(rp, mid + 1

, r);

}void change(int p, int l, int r, int x, int y, int

z) pushdown(p);

int mid = l + r >> 1

;

if (x <=mid) change(lp, l, mid, x, y, z);

if (y > mid) change(rp, mid + 1

, r, x, y, z);

}int

main()

sort(p + 1, p + 2 * n + 1

);

int last = 0, cnt = 0

;

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

else

}memset(tree,

0, sizeof

(tree));

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

) memset(vis,

0, sizeof

(vis));

ans = 0

; build(

1, 1

, cnt);

printf(

"%d\n

", ans);

}return0;

}

view code

D 線段線段

x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,10201020和12251225的重疊部分為12201220。給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。如果沒有重疊,輸出0。input 第1行 線段的數量n 2 n 5000...

2018 08 18 線段樹(線段樹)

線段樹 描述請你維護乙個線段樹 支援一下操作 a x l r 區間 and x o x l r區間 or x x x l r 區間 xor x s l r 區間求和 輸入乙個數 t表示資料組數 乙個數n表示初始序列長 m表示查詢 隨後n個整數 接下來m次詢問 如上 輸出所以s次詢問的答案 樣例輸入 ...

刪除多餘線段 線段樹

2020 3 24 更新 一,簡介 二,作用及原理 三,線段樹中最重要的 延遲標記 四,額外說明 五,具體實現 一,簡介線段樹,一種樹狀資料結構,顧名思議,樹的每乙個節點儲存的是線段的某種資訊,因此,你需要宣告乙個結構體來代表樹上的每乙個節點,最基本的資訊有線段的左端點,右端點,常用的有線段區間的元...