国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

bzoj 3190: [JLOI2013]賽車 (半平面交)

2019-11-08 03:05:53
字體:
來源:轉載
供稿:網友

3190: [JLOI2013]賽車

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1721  Solved: 529[Submit][Status][Discuss]

Description

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

Input

第一行有一個正整數N表示賽車的個數。接下來一行給出N個整數,按順序給出N輛賽車的起始位置。再接下來一行給出N個整數,按順序給出N輛賽車的恒定速度。 

Output

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

Sample Input

41 1 0 015 16 10 20

Sample Output

31 2 4

HINT

對于100%的數據N<=10000, 0<=ki<=10^9, 0<=vi<=10^9

2016.1.17新加數據一組 By Nano_ape

Source

[Submit][Status][Discuss]

題解:半平面交

其實這道題跟bzoj1007水平可見直線是基本上相同的。

有些細節需要注意,在計算的過程中可能會炸int。

如果好幾條直線相交于一點,那么這些直線都要輸出。

如果存在重合的直線,那么這些直線都要輸出。

#include<iostream>#include<cstring>#include<cmath>#include<cstdio>#include<algorithm>#define N 10003#define inf 1000000000#define LL long long using namespace std;struct data{	double k,b; int id;}a[N];bool Operator <(data a,data b) {	return a.k>b.k||a.k==b.k&&a.b<b.b;}int n,cnt,mark[N],q[N],ans[N];bool pd(data x1,data x2,data x3){	LL r1=(LL)(x3.k-x2.k)*(LL)(x2.b-x1.b);	LL r2=(LL)(x1.k-x2.k)*(LL)(x2.b-x3.b);	return r1>r2;}int main(){	freopen("race12.in","r",stdin);	freopen("my.out","w",stdout);	scanf("%d",&n);	for (int i=1;i<=n;i++) scanf("%lf",&a[i].b);	for (int i=1;i<=n;i++) scanf("%lf",&a[i].k),a[i].id=i;	a[0].k=-inf; a[0].b=0;	sort(a,a+n+1);	//for (int i=0;i<=n;i++) cout<<a[i].id<<" ";	//cout<<endl;	int head=0,tail=0;	for (int i=0;i<=n;i++) {		while (tail>0&&(pd(a[q[tail-1]],a[q[tail]],a[i])||a[i].k==a[q[tail]].k&&a[i].b>a[q[tail]].b)) 		 mark[a[q[tail]].id]=0,tail--;		if (a[i].k<a[q[tail]].k&&a[i].b<a[q[tail]].b) continue;		q[++tail]=i; mark[a[q[tail]].id]=1;	}	//for (int i=1;i<=n;i++) cout<<mark[i]<<" ";	//cout<<endl;	cnt=0;	for (int i=1;i<=n;i++) 	 if (mark[i]) ans[++cnt]=i;	PRintf("%d/n",cnt);	for (int i=1;i<=cnt-1;i++) printf("%d ",ans[i]);	printf("%d/n",ans[cnt]);}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桐城市| 株洲县| 凌源市| 侯马市| 都昌县| 泸定县| 惠来县| 漳平市| 德兴市| 罗山县| 黄龙县| 毕节市| 通辽市| 双江| 阿克陶县| 抚宁县| 同心县| 鹤峰县| 普陀区| 新龙县| 乐清市| 迁西县| 陈巴尔虎旗| 修文县| 丰镇市| 惠安县| 博白县| 大姚县| 苏州市| 新乐市| 库车县| 古交市| 武邑县| 塔城市| 光山县| 贡山| 安远县| 白河县| 万载县| 涟水县| 宜黄县|