bzoj1007 HNOI2008 水平可見直線

2022-05-31 08:36:12 字數 2336 閱讀 1743

在xoy直角座標平面上有n條直線l1,l2,...ln,若在y值為正無窮大處往下看,能見到li的某個子線段,則稱li為可見的,否則li為被覆蓋的.

例如,對於直線:

l1:y=x; l2:y=-x; l3:y=0

則l1和l2是可見的,l3是被覆蓋的.

給出n條直線,表示成y=ax+b的形式(|a|,|b|<=500000),且n條直線兩兩不重合.求出所有可見的直線.

第一行為n(0 < n < 50000),接下來的n行輸入ai,bi

從小到大輸出可見直線的編號,兩兩中間用空格隔開,最後乙個數字後面也必須有個空格

3-1 0

1 00 0

1 2可以發現最後就是乙個下凸的形狀。首先按照斜率排序,按順序加入,維護乙個單調棧,每次加入時檢查棧頂元素,畫圖可以發現,如果當前加入的直線與棧頂直線交點在前乙個交點的左邊,則棧頂元素出棧。這樣就是o(n)了。

1

program

lines(input,output);

2var

3 a,b,c,z:array[0..50050]of

longint;

4 d:array[0..50050]of

double;

5 ans:array[0..50050]of

boolean;

6n,m,i,j:longint;

7procedure

sort(q,h:longint);

8var

9i,j,xa,xb,t:longint;

10begin

11 i:=q;j:=h;xa:=a[(i+j)>>1];xb:=b[(i+j)>>1

];12

repeat

13while (a[i]or (a[i]=xa) and (b[i]>xb) do

inc(i);

14while (xaor (xa=a[j]) and (xb>b[j]) do

dec(j);

15if i<=j then

16begin

17 t:=a[i];a[i]:=a[j];a[j]:=t;

18 t:=b[i];b[i]:=b[j];b[j]:=t;

19 t:=c[i];c[i]:=c[j];c[j]:=t;

20inc(i);dec(j);

21end;22

until i>j;

23if j>q then

sort(q,j);

24if ithen

sort(i,h);

25end;26

function

claris(x,y:longint):double;

27begin

28 exit((b[y]-b[x])/(a[x]-a[y]));

29end;30

begin

31 assign(input,'

lines.in

');assign(output,'

lines.out

');reset(input);rewrite(output);

32readln(n);

33for i:=1

to n do

begin readln(a[i],b[i]);c[i]:=i; end

;34 sort(1

,n);

35 m:=1;36

for i:=2

to n do

if a[i]<>a[i-1] then

begin inc(m);a[m]:=a[i];b[m]:=b[i];c[m]:=c[i] end

;37 z[1]:=1;z[2]:=2;d[2]:=claris(1,2);j:=2;38

for i:=3

to m do

39begin

40while (claris(i,z[j])<=d[j]) and (j>1) do

dec(j);

41 inc(j);z[j]:=i;d[j]:=claris(z[j],z[j-1

]);42

end;

43fillchar(ans,sizeof(ans),false);

44for i:=1

to j do ans[c[z[i]]]:=true;

45for i:=1

to n do

if ans[i] then write(i,'');

46close(input);close(output);

47end.

BZOJ1007 HNOI2008 水平可見直線

description 在xoy直角座標平面上有n條直線l1,l2,ln,若在y值為正無窮大處往下看,能見到li的某個子線段,則稱li為 可見的,否則li為被覆蓋的.例如,對於直線 l1 y x l2 y x l3 y 0 則l1和l2是可見的,l3是被覆蓋的.給出n條直線,表示成y ax b的形式...

bzoj1007 HNOI2008 水平可見直線

time limit 1 sec memory limit 162 mb submit 4365 solved 1599 在xoy直角座標平面上有n條直線l1,l2,ln,若在y值為正無窮大處往下看,能見到li的某個子線段,則稱li為可見的,否則li為被覆蓋的.例如,對於直線 l1 y x l2 y...

狡猾的商人 bzoj1202,HNOI2005

ac通道 分析 因為每月的總收入可以為正,也可以為負,所以要比較兩個區間是否相符,當且僅當它們邊界都相同時才能比較。我們設w i 表示第1 i個月的總收入與第1 fa i 1 個月的總收入之差,及第fa i i個月的總收入。如圖。若i 1,j在同乙個集合中,則第i j個月的總收入為w j w i 1...