NOI2007 貨幣兌換

2022-06-01 08:39:10 字數 1244 閱讀 8906

妙啊,我最喜歡碼農題偷懶了。

洛谷首先 \(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...