bzoj3190 單調棧 賽車

2021-08-18 20:13:38 字數 1564 閱讀 3589

description

這裡有一輛賽車比賽正在進行,賽場上一共有n輛車,分別稱為個g1,g2……gn。賽道是一條無限長的直線。最初,gi位於距離起跑線前進ki的位置。比賽開始後,車輛gi將會以vi單位每秒的恆定速度行駛。在這個比賽過程中,如果一輛賽車曾經處於領跑位置的話(即沒有其他的賽車跑在他的前面),這輛賽車最後就可以得獎,而且比賽過程中不用擔心相撞的問題。現在給出所有賽車的起始位置和速度,你的任務就是算出那些賽車將會得獎。

input

第一行有乙個正整數n表示賽車的個數。 接下來一行給出n個整數,按順序給出n輛賽車的起始位置。

再接下來一行給出n個整數,按順序給出n輛賽車的恆定速度。

output

輸出包括兩行,第一行為獲獎的賽車個數。 第二行按從小到大的順序輸出獲獎賽車的編號,編號之間用空格隔開,注意最後乙個編號後面不要加空格。

sample input

1 1 0 0

15 16 10 20

sample output

1 2 4

hint

對於100%的資料n<=10000, 0<=ki<=10^9, 0<=vi<=10^9

2016.1.17新加資料一組 by nano_ape

題解

你先把這堆賽車的s-t影象搞出來,然後不就和水平可見直線差不多的嗎??

一開始我以為這堆射線是散落在第一象限裡的,然後搞了搞發現原來是全部從y軸射出的。。

把射線按斜率排序,維護乙個單調棧,下凸包

踢棧頂的方法有兩個

1:斜率比棧頂不小,且出發點比棧頂高

2:這條直線與棧中第二個頂這條直線能完全遮蔽該直線,注意不能交於一點!

然後注意一下細節就過了???

那為什麼網上都是半平面交

#include

#include

#include

#include

#include

using

namespace

std;

struct node

a[11000];int n,len;

bool cmp(node n1,node n2)

int sta[11000],tp;

int ans[11000];

int main()

sta[++tp]=i;

}for(int i=1;i<=tp;i++)ans[i]=a[sta[i]].op;

sort(ans+1,ans+1+tp);

printf("%d\n",tp);

for(int i=1;iprintf("%d ",ans[i]);

printf("%d\n",ans[tp]);

return

0;}

bzoj 3190 賽車 半平面交

直接寫的裸的半平面交,已經有點背不過模板了。這題卡精度,要用long double esp設1e 20。include include include include include include include define n 20005 define double long double d...

BZOJ3190 JLOI2013 賽車 半平面交

看了黃學長的 每輛車可以表示成乙個一次函式y kx b 按k 為第一關鍵字,b為第二關鍵字排序,然後維護乙個單調棧就好了,具體的ju dge 函式看 include define bug x cout x x define ll long long define eps 1e 7 using nam...

bzoj3039 玉蟾宮 單調棧

題目描述 給定乙個01矩陣,找出乙個面積最大的子矩陣,使得其中的元素均為1。輸出這個最大面積乘3。輸入第一行兩個整數n,m,表示矩形土地有n行m列。接下來n行,每行m個用空格隔開的字元 f 或 r 描述了矩形土地。輸出輸出乙個整數,表示你能得到多少銀子,即 3 最大 f 矩形土地面積 的值。樣例輸入...