給定平面上的一些黑點,其它位置都是白點,乙個白點如果上下左右都有黑點就會變成黑點,求最終會有多少個黑點
就是求交點個數
離散化後,取出所有線段,然後沿任意乙個軸朝著乙個方向掃,然後把平行於另乙個軸的線段用端點記錄,掃到一端就在樹狀陣列裡+1,另一端-1,樹狀陣列求個區間和貢獻答案即可
const
maxn=200000;
type
data=array[0..2*maxn,1..3]of longint;
var x,y,z:data;
bit:array[0..maxn]of longint;
i,j,k:longint;
n,len,rx,ry,ans:longint;
function
min(a,b:longint):longint;
begin
if a>b then
exit(b) else
exit(a);
end;
function
max(a,b:longint):longint;
begin
if athen
exit(b) else
exit(a);
end;
procedure
sort
(var x:data; l,r:longint);
var i,j,a,b:longint;
begin
i:=l; j:=r; a:=x[(l+r) div
2,1];
repeat
while x[i,1]do inc(i);
while a1] do dec(j);
ifnot(i>j) then
begin
b:=x[i,1]; x[i,1]:=x[j,1]; x[j,1]:=b;
b:=x[i,2]; x[i,2]:=x[j,2]; x[j,2]:=b;
b:=x[i,3]; x[i,3]:=x[j,3]; x[j,3]:=b;
inc(i); dec(j);
end;
until i>j;
if lthen sort(x,l,j);
if ithen sort(x,i,r);
end;
procedure
update
(pos,val:longint);
begin
while pos<=ry do
begin
inc(bit[pos],val);
inc(pos,pos and (-pos));
end;
end;
function
query
(pos:longint):longint;
var sum:longint;
begin
sum:=0;
while pos>0
dobegin
inc(sum,bit[pos]);
dec(pos,pos and (-pos));
end;
exit(sum);
end;
begin
readln(n);
for i:=1
to n do
readln(z[i,1],z[i,2]);
for i:=1
to n do
begin
x[i,1]:=z[i,1];
x[i,2]:=i;
end;
sort(x,1,n);
len:=0; x[0,1]:=-100000005;
for i:=1
to n do
if x[i,1]<>x[i-1,1]
then
begin inc(len); z[x[i,2],1]:=len; end
else z[x[i,2],1]:=len;
ry:=len;
for i:=1
to n do
begin
x[i,1]:=z[i,2];
x[i,2]:=i;
end;
sort(x,1,n);
len:=0; x[0,1]:=-100000005;
for i:=1
to n do
if x[i,1]<>x[i-1,1]
then
begin inc(len); z[x[i,2],2]:=len; end
else z[x[i,2],2]:=len;
rx:=len;
for i:=1
to n do
begin x[i,1]:=-maxlongint; x[i,2]:=maxlongint; y[i,1]:=-maxlongint; y[i,2]:=maxlongint; end;
for i:=1
to n do
begin
if x[z[i,2],1]=-maxlongint
then
begin x[z[i,2],1]:=z[i,1]; x[z[i,2],2]:=z[i,1]; end
else
begin x[z[i,2],1]:=min(z[i,1],x[z[i,2],1]); x[z[i,2],2]:=max(z[i,1],x[z[i,2],2]); end;
if y[z[i,1],1]=-maxlongint
then
begin y[z[i,1],1]:=z[i,2]; y[z[i,1],2]:=z[i,2]; end
else
begin y[z[i,1],1]:=min(z[i,2],y[z[i,1],1]); y[z[i,1],2]:=max(z[i,2],y[z[i,1],2]); end;
end;
ans:=0; len:=0;
for i:=1
to ry do
begin
inc(len); z[len,1]:=y[i,1]; z[len,2]:=i; z[len,3]:=1;
inc(len); z[len,1]:=y[i,2]+1; z[len,2]:=i; z[len,3]:=-1;
end;
sort(z,1,len);
j:=1;
for i:=1
to rx do
begin
while z[j,1]=i do
begin
update(z[j,2],z[j,3]);
inc(j);
end;
ans:=ans+query(x[i,2])-query(x[i,1]-1);
end;
writeln(ans);
end.
bzoj1818 Cqoi2010 內部白點
description 無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的 網格的頂點即座標為整數的點,又稱整點 每秒鐘,所有內部白點同時變黑,直到不存在內部白點為止。你的任務是統計最後網格中的黑點個數。內部白點的定義 乙個白色的整點p x,y 是內部白點當且僅當p在水平線的左邊和右邊各至少...
bzoj1818 Cqoi2010 內部白點
description 無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的 網格的頂點即座標為整數的點,又稱整點 每秒鐘,所有內部白點同時變黑,直到不存在內部白點為止。你的任務是統計最後網格中的黑點個數。內部白點的定義 乙個白色的整點p x,y 是內部白點當且僅當p在水平線的左邊和右邊各至少...
bzoj1818 Cqoi2010 內部白點
time limit 10 sec memory limit 64 mb submit 1218 solved 570 submit status discuss 無限大正方形網格裡有n個黑色的頂點,所有其他頂點都是白色的 網格的頂點即座標為整數的點,又稱整點 每秒鐘,所有內部白點同時變黑,直到不存...