日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【洛谷 P3194】 [HNOI2008]水平可见直线 (单调栈)

發(fā)布時間:2025/4/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【洛谷 P3194】 [HNOI2008]水平可见直线 (单调栈) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接
把線段以斜率為第一關鍵字,截距為第二關鍵字升序排序。
然后維護一個單調棧,保證棧中兩兩線段的交點的\(x\)坐標單調上升就行了。棧中的線段即為所求。

#include <cstdio> #include <algorithm> using namespace std; const int MAXN = 50010; struct Seg{double k, b;int id;int operator < (const Seg A) const{return k == A.k ? b < A.b : k < A.k;} }s[MAXN]; int n; int st[MAXN], top; inline int cmp(int a, int b){return s[a].id < s[b].id; } double calc(int a, int b){return (s[b].b - s[a].b) / (s[a].k - s[b].k); } int main(){scanf("%d", &n);for(int i = 1; i <= n; ++i){scanf("%lf%lf", &s[i].k, &s[i].b);s[i].id = i;}sort(s + 1, s + n + 1);st[++top] = 1;for(int i = 2; i <= n; ++i){while(top && s[i].k == s[st[top]].k || top > 1 && calc(i, st[top - 1]) <= calc(st[top], st[top - 1])) --top;st[++top] = i;}sort(st + 1, st + top + 1, cmp);for(int i = 1; i <= top; ++i)printf("%d ", s[st[i]].id);return 0; }

轉載于:https://www.cnblogs.com/Qihoo360/p/10322557.html

總結

以上是生活随笔為你收集整理的【洛谷 P3194】 [HNOI2008]水平可见直线 (单调栈)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。