題意前兩種做法參考部落格:
這裡就不再贅述,不過需要提一下,第二種做法感覺有點問題的地方是:\(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就行了吧!乙個乙個合併顯然不行,...