BZOJ1818 Cqoi2010 內部白點

2021-07-09 21:45:45 字數 3401 閱讀 4070

給定平面上的一些黑點,其它位置都是白點,乙個白點如果上下左右都有黑點就會變成黑點,求最終會有多少個黑點

就是求交點個數

離散化後,取出所有線段,然後沿任意乙個軸朝著乙個方向掃,然後把平行於另乙個軸的線段用端點記錄,掃到一端就在樹狀陣列裡+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個黑色的頂點,所有其他頂點都是白色的 網格的頂點即座標為整數的點,又稱整點 每秒鐘,所有內部白點同時變黑,直到不存...