妙啊,我最喜歡碼農題偷懶了。
洛谷首先 \(o(n^2)\) 的 \(dp\) 很好想,令 \(f_i\) 為第 \(i\) 天最多獲得的錢,則有:
\(f_i=\max\+\frac\}\)
令 \(a_j=\frac,b_j=\frac\)
\(f_i=\max\=b_i\max\+b_j\}\)
哦,後面的 \(a_j\frac+b_j\) 不就是一次函式 \(kx+b\) 的形式嗎?!
李超線段樹!!!
為防止精度誤差,要對 \(\frac\) 離散化,而且這樣常數也會小一些,不需要浮點數動態開點。
時間複雜度 \(o(nlog^2n)\)。
其實可以優化一下,因為我們發現本題中我們插入的線段定義域都是 \(x\in[1,n]\)(離散化後),所以我們在插入的時候一定不會走兩邊,可以少掉乙個 \(log\)。
還有乙個\(\color\)優化是在詢問時如果乙個區間中沒有線段,那麼下面一定也沒有,直接返回,與上乙個優化同理。
query沒返回值還能過40pts是我沒想到的。
const int maxn = 100005;
int n;
double s,a[maxn],b[maxn],r[maxn],lsh[maxn];
struct line
line(double k1,double b1,bool f1)
};double getf(line l,int x)
#define lc (x<<1)
#define rc (x<<1|1)
struct lichaosegmenttree
double xl = getf(t[x],l),xr = getf(t[x],r),wl = getf(w,l),wr = getf(w,r);
if(wl >= xl && wr >= xr) //completely win
else if(wl <= xl && wr <= xr) return;//completely lose
else//worthy opponent
}double query(int x,int l,int r,int pos)
}st;
int main()
sort(lsh+1,lsh+n+1);
for(int i = 1;i <= n;++ i)
printf("%.3f",s);
return 0;
}
NOI2007 貨幣兌換
今天聽了crazy和samjia的noi雜 砸 題選講,感覺自己萌萌噠 於是就來怡情地寫了這道題。額 o 這個不好說啊。語文不好不好裱我 還是貼圖吧。咳咳,希望大家都看懂題了。乙個很明顯的貪心思路就是,我們每天要不全買,要不全賣。因為一有利益我們就去佔,一有虧損我們就不碰。那麼我們可以有dp方程 f...
Noi2007 貨幣兌換
傳送門 小半個上午 一下午都給了這題了qaq 都知道是斜率優化,問題是我看這題根本就是乙個人乙個式子啊 算了,把我的過程列出來吧 令 f i 表示第i天結束時強制賣出所有金券最多能得到的軟妹幣數量,列舉上一次 金券的時間,就有 beginf i max end 這裡沒有寫隱含條件 f i ge f ...
NOI2007 貨幣兌換
題目 先來畫一畫柿子 設 dp i 表示你第 i 天之後最多剩下多少錢 考慮一下對於 i 的轉移,我們肯定要在之前列舉一天 j 這一天把所有的東西買進來,之後在 i 天賣掉 設那天買進 a 的量為 d a 買進 b 的量為 d b 我們可以得到這樣的方程 d ap a d bp b dp j d a...