SCOI2016 妖怪(另類nlogn做法)

2022-05-09 15:35:30 字數 1578 閱讀 2095

題意前兩種做法參考部落格:

這裡就不再贅述,不過需要提一下,第二種做法感覺有點問題的地方是:\(k\)應該在\([k2,k1]\)範圍內。(當然,僅僅個人觀點,不一定正確)

然後我自己手艹出乙個做法?

首先,已知對於\((a,b)\),可以化作\((1,\frac)\)的形式,不妨化為:\((1,k)\),這樣,就順利的化成了乙個元的形式了。

那麼對於乙隻妖怪,其戰鬥力函式為:\(a+b+ak+\frac\)。

不難發現,如果對於兩個妖怪:\(a_≤a_2,b_1≤b_2\)那麼第乙個妖怪絕對沒有第二個妖怪好,此時,自動把第乙個妖怪捨棄,然後再對於\(a\)進行公升序排序,這樣,妖怪就是\(a\)值遞增,\(b\)值遞減了。

考慮第乙個妖怪在哪個大於第二個妖怪:

設\(a'=a_-a_,b'=b_-b_\)

那麼不等式方程則為:

\(a'k+\frac+a'+b'≥0\)

\(a'k^2+(a'+b')k+b'≥0\)

\(k∈[-1,0)∩(0,-\frac]\),由於\(k>0\),所以\(k∈(0,-\frac]\)。

也就是說,第乙個妖怪在這個區間都比第二個區間好。

那麼只要我們能夠找到這些妖怪各自的最強的區間,然後對他們的函式在他們區間中的最小值取最小值即可。

但是如何證明乙個函式的\(k\)存在乙個取值區間這個函式值大於其他的函式值呢?

再次證明乙個東西:\(\frac>\frac\)可以推導出:\(\frac<\frac-b_2}\)。

證明過程就是交叉相乘,後面發現兩條式子可以化成一條式子,那麼這條式子說明了什麼了?下面設\(a_i\)為第乙個函式,\(jd()\)為交點,說明\(jd(a_1,a_3),那麼\(jd(a_2,a_3),簡單來說就是\(a_2\)的\(k\)不可能存在乙個取值區間使得這個函式值大於其他函式值。

同理,只要用棧維護每個函式,彈出時判斷與\(a_1\)的交點即可,然後\(a_i\)的\(k\)的取值區間則在:[\(jd(a_,a_i)\),\(jd(a_,a_)\)]範圍內。

至於函式的最小值,額,直接均值不等式,這個不再多講了。

時間複雜度:\(o(nlogn)\)

#include#include#include#include#define  n  1100000

using namespace std;

templateinline t mymin(t x,t y)

int n;

struct node

}a[n],b[n];int m;

inline node operator-(node x,node y)

inline double jd(node x)//求交點

inline double getval(node x,double k)

inline double mmin(node x,double l,double r)

} if(m==1)printf("%.4lf\n",getval(b[1],sqrt(b[1].b/b[1].a)));

else

return 0;

}

SCOI2016 背單詞 題解

題意的話就看題面吧。我們一步一步的來分析 首先吃最少的泡椒,那麼顯然可以貪心,由於n n n times n n n貢獻的肯定比後面的方式都大,所以我們考慮將乙個串它的所有存在的字尾串全部先放在前面,這時就不會用第一種了,然後我們考慮,可以將這種關係用邊連起來,就成了一棵樹,我們可以舉個例子來看 5...

SCOI2016 幸運數字

線性基合併o log 2n 不能更小 但是倍增o qlog 3n 可過233333 甚至樹剖o qlog 4n 可過666666 還有乙個樹上路徑查詢利器 點分治!詢問離線 列舉重心,處理路徑過重心的詢問 邊dfs邊插入線性基,維護每個點到根路徑上的線性基 每個詢問,如果所屬不同的子樹,那麼過當前重...

SCOI2016 幸運數字

不想說了.就樹上的線性基合併.但是講道理o nlogn 3 為什麼能過去呢.但是就是能過去啊,因為博主是菜雞不怎麼會澱粉質啊,所以本篇題解只能提供這個複雜度的演算法了qaq 求選出來一些數使得異或和最大?線性基啊!那怎麼求路徑上的呢?乙個乙個往上合併,一直合併到lca就行了吧!乙個乙個合併顯然不行,...