2647 線段樹題練習四

2021-07-31 20:20:35 字數 1743 閱讀 4634

x軸上有若干條不同線段,問某個單位區間[x,x+1]上重疊了多少條線段?

區間大小不超過100000

每行表示一條線段x,y

最後一行表示x,x+1

題庫上的輸入樣例和資料的輸入完全不同!

只好用eoln來讀入,而且資料中會出現x>y!

最後打出乙個線段樹

每乙個區間記錄乙個c,表示這整個區間有多少條線段。統計是從(b[p]=x,e[p]=x+1)一直加到c[1],輸出結果

時間複雜度o(m log n)

var

b,e,j,k,c:array[1..1000000]of longint;

n,m,i:longint;

procedure

setup

(p:longint);

var m:longint;

begin

if e[p]-b[p]>1

then

begin

m:=(b[p]+e[p])div

2; b[p*2]:=b[p];

e[p*2]:=m;

b[p*2+1]:=m;

e[p*2+1]:=e[p];

setup(p*2);

setup(p*2+1);

end;

end;

procedure

insert

(p,l,r:longint);

var m:longint;

begin

if (b[p]=l)and(e[p]=r) then

begin c[p]:=c[p]+1;exit;end;

m:=(b[p]+e[p])div

2; if r<=m then insert(p*2,l,r) else

if l>=m then insert(p*2+1,l,r) else

begin

insert(p*2,l,m);

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

end;

end;

function

count

(p,l:longint):longint;

var m,k:longint;

begin

if e[p]-b[p]=1

then

exit(c[p]);

m:=(b[p]+e[p]) div

2; if l+1

<=m then k:=count(p*2,l) else

if l>=m then k:=count(p*2+1,l);

exit(k+c[p]);

end;

begin

while

not eoln do

begin

inc(m);

readln(j[m],k[m]);

if j[m]>k[m] then

begin

i:=j[m];

j[m]:=k[m];

k[m]:=i;

end;

if k[m]>n then n:=k[m];

end;

b[1]:=1;e[1]:=n;

setup(1);

for i:=1

to m-1

do insert(1,j[i],k[i]);

writeln(count(1,j[m]));

end.

線段樹 SSLOJ 2647 線段樹練習四

ssl oj ssloj sslo j2647 2647 2647 在平面內有一條長度為n的線段 也算一條線段 可以對進行以下2種操作 1 x y 把從x到y的再加一條線段 2 x 查詢從x到x 1有多少條線段 第一行輸入n,m 第2 m 1行,每行3個數 對於每個查詢操作,輸出線段數目 7 2 2...

SSLGZ 2647 線段樹練習四

問題描述 在平面內有一條長度為n的線段 也算一條線段 可以對進行以下2種操作 1 x y 把從x到y的再加一條線段 2 x 查詢從x到x 1有多少條線段 輸入 第一行兩個數n,m 表示長度為n的線段 接下來的m行讀入x,y 表示在 x,y 的區間中加入一條線段 最後一行兩個數x,y 輸出x到y這乙個...

SSL P2647 線段樹練習四

題目大意 在長為n的線段中 這條線段不算 加入m條線段 x,y 最後查詢某個線段 x,y 保證y x 1。1 n,m 100000,1 x y n 題解 就是乙個線段樹 lazy 1.每次走的時候因為如果你二分到這乙個區間就代表你插入的線段一定經過這個區間,這個區間的線段數 1,如果查詢到的剛好跟插...