線段樹練習題一

2021-07-30 13:54:39 字數 1714 閱讀 1091

線段樹練習題一

description

桌子上零散地放著若干個盒子,桌子的後方是一堵牆。如右圖所示。現在從桌子的前方射來一束平行光, 把盒子的影子投射到了牆上。問影子的總寬度是多少? 

分析

給線段樹每個節點增加乙個域cover。cover=1表示該結點所對應的區間被完全覆蓋,cover=0表示該結點所對應的區間未被完全覆蓋,最後統計一下。

**

const

maxn=1000000;

type

tnode=record

a,b:longint;

end;

vartree:array[0..maxn] of tnode;

cover:array[0..maxn] of longint;

i,j,n,m,x,y:longint;

procedure create(p:longint);

varm:longint;

begin

if tree[p].b-tree[p].a>1 then

begin

m:=(tree[p].a+tree[p].b) div 2;

tree[p*2].a:=tree[p].a;

tree[p*2].b:=m;

tree[p*2+1].a:=m;

tree[p*2+1].b:=tree[p].b;

create(p*2);

create(p*2+1);

end;

end;

procedure insert(p,x,y:longint);

varm:longint;

begin

if cover[p]=0 then

begin

m:=(tree[p].a+tree[p].b) div 2;

if (tree[p].a=x) and (tree[p].b=y)

then cover[p]:=1

else if y<=m

then insert(p*2,x,y)

else if x>=m

then insert(p*2+1,x,y)

else begin

insert(p*2,x,m);

insert(p*2+1,m,y);

end;

end;

end;

function count(p:longint):longint;

varm:longint;

begin

if cover[p]=1 then count:=tree[p].b-tree[p].a

else if tree[p].b-tree[p].a=1

then count:=0

else count:=count(p*2)+count(p*2+1);

end;

begin

readln(m);

tree[1].a:=1;

tree[1].b:=m;

create(1);

readln(n);

for i:=1 to n do

begin

readln(x,y);

insert(1,x,y);

end;

writeln(count(1));

end.

線段樹 線段樹練習題一

桌子上零散地放著若干個盒子,桌子的後方是一堵牆。如右圖所示。現在從桌子的前方射來一束平行光,把盒子的影子投射到了牆上。問影子的總寬度是多少?第一行,乙個數m代表桌面寬度 第二行,乙個數n代表盒子數量 第2到n 2行,每行兩個數代表盒子開始與結束的位置 output 乙個數,影子的總寬度 sample...

線段樹(li san hua)練習題一

桌子上零散地放著若干個盒子,桌子的後方是一堵牆。如右圖所示。現在從桌子的前方射來一束平行光,把盒子的影子投射到了牆上。問影子的總寬度是多少?20 桌面總寬度 4 盒子數量 1 53 8 7 10 13 19 資料範圍 1 n 100000,1 m 100000,保證座標範圍為 1,n 先把所有端點座...

線段樹練習題二

線段樹練習題二 description 桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠 輸入時,由底向上,從左到右 分析 cover 0表示該區間由多種顏色組成。cover 0表示該區間只有一種單一的顏色cover,最後用個桶統...