7 10省隊集訓夢工廠

2021-07-03 17:47:29 字數 1033 閱讀 4108

思路:題面真心長....單調棧維護上凸殼即可

設sum[i]為前i道工序的複雜度之和,g[i]為第i個快樂最早開始生產的時間。因為我們要保證沒有兩個快樂同時出現在同一道工序,所以

g[i]=g[i-1]+max(sum[j]*f[i-1]-sum[j-1]*f[i])

然後就是像斜率優化的過程了

sum[j]*f[i-1]=f[i]*sum[j-1]+g[i]-g[i-1]

sum[j]=f[i]/f[i-1]*sum[j-1]+(g[i]-g[i-1])/f[i-1]

y     =     k     *       x       +              b

於是可以發現使g[i]最大的點一定在乙個上凸殼上,因為查詢的斜率f[i]/f[i-1]不單調,用單調棧維護,二分查詢即可。

#include#include#include#include#define max(a,b) (a>b?a:b)

#define ll long long

const int maxn=2000010,inf=(int)1e9;

const double eps=1e-9;

using namespace std;

int n,m,sum[maxn],f[maxn],t[maxn],q[maxn],top;ll tim,g[maxn];char ch;

void read(int &x)

double slope(int i,int j)

void work()

q[++top]=i,q[top+1]=inf;

}for (int i=2;i<=m;i++)

g[i]=g[i-1]+(ll)sum[q[mid]]*f[i-1]-(ll)sum[q[mid]-1]*f[i];

}printf("%lld\n",1ll*(g[m]+1ll*sum[n]*f[m]));}

int main()

7 5省隊集訓 tree

思路 樹形dp。先求最大值。令s x 為x的子樹中葉子節點的數量。f x 為到x時 為先手走,先手能取到的值在子樹中排第f x 小。g x 為到x時 為後手走,後手能取到的值在子樹中排第f x 小。對f x 先手應該往哪個子樹走呢?對於x的一棵子樹y,如果進入,那麼最終答案就是這棵子樹中第g y 小...

FJOI省隊集訓 florida

省隊成員 大部分 都沒來.像我這種沙茶天天寫寫玄學演算法都能排在榜上面.果然正解寫掛的人遠比暴力拍對的人少啊.陸陸續續會補一些題解。不過有些題太神了可能補不上題解 有n個物品,兩個袋子a和b。若物品i與j放在同乙個袋子裡,那麼代價為t i j 保證t i i 0,t i j t j i 乙個袋子的代...

省隊集訓DAY2

假設我們列舉數列中長度為len的區間,那麼如何判斷兩個數列可以匹配呢?對於提取的數列從小到大排序,從大到小排序,然後兩兩配對,如果所有的都滿足 h 那麼就可以匹配。應該算是貪心吧。這樣做的時間複雜度是o n le n loglen 還是上面的思想,我們如何快速判斷呢?假設我們確定了提取出的區間數列,...