2018暑假牛客多校二 C(凸包)

2021-08-21 17:48:54 字數 878 閱讀 7059

有乙個無線大的平面,平面上有n條斜率不為零的直線。 有m次詢問,每次詢問從y軸上的乙個點出發往x軸正方向沿一條直線走,最後乙個與這n條直線相交的點的 橫座標。 n,m<=50000

根據題意我們可以,如果一條直線為 y=ax+b,另一條直線為 y=cx+d,則我們容易得出他們的交點的橫座標為

因此我們可以將這個橫座標看作是兩個點(a,b),(c,d)之間的斜率的相反數。

因此我們就可以將題目轉化成:在平面內又n個點pi,每次給乙個點p,問這個點到平面內所有點的斜率最小值。

而因為最小值相對來說沒這麼好處理,因此我們則可以將所有點的橫座標取反,則這個題就轉化為求斜率的最大值。

對於這個問題,我們就可以通過凸包進行維護。

具體的做法是:我們先根據題目給出的n個直線(將他們看成乙個個點對),做乙個凸包。因為做出來的凸包上的每乙個點是存在一定的單調性的,因此我們可以在凸包上二分查詢出跟詢問的點p斜率最大的點。(具體的二分操作是如果發現當前選到的凸包上的兩點p1,p2與詢問的點p的叉積

當找到斜率最大的點後,不斷更新答案即可。

#include #define maxn 100005

using namespace std;

const double eps=1e-8;

int sgn(double x)

else

if(l}}

}int main()

scanf("%d",&m);

for(int i=0;i

sort(p,p+n+m);

graham(n+m);

reverse(p,p+n+m);

graham(n+m);

for(int i=1;i<=m;i++)

}

2018牛客暑假多校二 D(貪心)

你要按照順序以此經過n個商店,每到達乙個商店你可以購買一件物品,也可以 你手中的商品。同一時刻你手上最多拿一件商品。在第i個商店購買和 的代價都是a i 問你經過完n個商店後的最大收益。同時,在最大化收益的前提下,求最小的交易次數。不難發現,要想使得利益最大,我們肯定是要在乙個單調區域中的最小值中購...

2018牛客暑假多校三 E(KMP運用)

給你乙個字串s,你要對字串s的每一位i將前i位的字串移動到尾部形成乙個新的字串,如果形成的字串相同則歸為一類li。現在讓你將li類按照字典序排序,並讓你輸出每一類的數量和每一類中字串對應的下標i。觀察可以發現,將字串移動形成新的字串,當且僅當字串中存在迴圈節時,才會出現新構成的字串相同。因此這個問題...

2018牛客多校3

h diff prime pairs 1 3 1 5 1 7 1 11.2 3 2 5 2 7 2 11.3 3 3 5 3 7 3 11.4 3 4 5 4 7 4 11.打個素數表 用素數篩一遍 includeusing namespace std bool a 11111111 int zs ...