線段樹練習題一
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,最後用個桶統...