description
在遙遠的火星上,上面的植物非常奇怪,都是長方形的,每個植物用三個數來描述:左邊界l、右邊界r以及高度h,如下圖所示描述乙個植物:l=2,r=5和h=4。
每天都有乙個新植物長出來,第一天的植物高度為1,後面每天長出的植物比前一天的高1。
當乙個新植物長出來的時候,跟其他植物的水平線段相交處會長出一朵小花(前提是之前沒有長出花朵),如果線段交於端點,是不會長花的。
下圖為示意圖:
給出每天的植物的座標,計算每天長出多少新花。
第一行包含乙個整數n(1<=n<=100000),表示天數。
接下來n行,每行兩個整數l和r(1<=l<=r<=100000),表示植物的左右邊界。
輸出每天長出新植物後增加新花的數量。
看到線段和區間就要想到線段樹,這是應該的吧
維護一棵線段樹,記錄區間上有多少線段覆蓋
每次查詢當前線段的l,l和r,r線段覆蓋數,減去重複的u[l]和u[r]就是答案
(自行畫圖理解一下)
type
tree=record
l,r,c:longint;
end;
var t:array[0..801872]of tree;
u:array[0..100000]of longint;
ans,p:longint;
procedure
build
(f,x,y:longint);
var mid:longint;
begin
t[f].l:=x;
t[f].r:=y;
if y=x then
exit;
mid:=(x+y)div
2; build(f*2,x,mid);
build(f*2+1,mid+1,y);
end;
procedure
add(f,x,y:longint);
var mid:longint;
begin
mid:=(t[f].l+t[f].r)div
2; if (x=t[f].l)and(y=t[f].r) then
inc(t[f].c)
else
if (y<=mid) then
add(f*2,x,y)
else
if (x>=mid+1) then
add(f*2+1,x,y)
else
begin
add(f*2,x,mid);
add(f*2+1,mid+1,y);
end;
end;
procedure
find
(f,x,y:longint);
var mid:longint;
begin
ans:=ans+t[f].c;
mid:=(t[f].l+t[f].r)div
2; if (t[f].l=x)and(t[f].r=y) then
exit
else
if y<=mid then
find(f*2,x,y)
else
if x>=mid+1
then
find(f*2+1,x,y)
else
begin
find(f*2+1,x,mid);
find(f*2+1,mid+1,y);
end;
end;
procedure
main;
var n,i,j,k:longint;
x,y,g:longint;
begin
readln(n);
build(1,1,100000);
for i:=1
to n do
begin
readln(x,y);
ans:=0;
find(1,x,x);
j:=ans;
find(1,y,y);
k:=ans-j;
writeln(ans-u[x]-u[y]);
u[x]:=j+1;
u[y]:=k+1;
add(1,x,y);
end;
end;
begin
main;
end.
開花 紀中 1435 線段樹
在遙遠的火星上,上面的植物非常奇怪,都是長方形的,每個植物用三個數來描述 左邊界l 右邊界r以及高度h,如下圖所示描述乙個植物 l 2,r 5和h 4。每天都有乙個新植物長出來,第一天的植物高度為1,後面每天長出的植物比前一天的高1。當乙個新植物長出來的時候,跟其他植物的水平線段相交處會長出一朵小花...
(紀中)2173 無根樹 tree SPFA
file io input tree.in output tree.out 時間限制 1000 ms 空間限制 131072 kb 具體限制 goto problemset 題目描述 味味最近對樹很感興趣,什麼是樹呢?樹就是有n nn個點和n 1 n 1n 1條邊形成的無環連通無向圖。今年2012 ...
2017紀中10 24 合影 樹型DP 組合數學
題面 因為每個人只有乙個要求,假如a要求在b左邊,a就向b連一條邊的話,就是乙個帶環樹。當然,有環直接無解。所以剩下的是森林。我們把子樹看成乙個子問題,假如知道了子樹內部的答案如何轉移到父親。設當前轉移x,x的所有子樹都應該安排在x左邊,也就是首先有size x 1個空來安排,每安排乙個子樹剩下的空...