Newcoder練習賽40D 小A與最大子段和

2022-03-27 03:32:57 字數 1050 閱讀 1181

題目

挺好的一道題

我們考慮把\(i\)作為選取的最大子段的結束位置,我們如何往前計算貢獻呢

考慮一下這個乘上其在佇列中的位置可以表示為這個數被算了多少次,而我們往前擴充套件一位當前已經被擴充套件的就會被計算一次

設\(s_i\)表示序列的字首和

擴充套件一次

\[s_i-s_

\]再擴充套件一次

\[s_i-s_+s_i-s_

\]發現如果我們往前算到第\(j\)項的話貢獻就是

\[(i-j+1)\times s_i-\sum_^s_k

\]如果對字首和序列在求乙個字首和,得到乙個\(s\)序列就變成了這個柿子

\[i\times s_i-s_ij+s_i-s_+s_

\]發現只有

\[-s_ij+s_

\]會影響我們的決策,所以考慮讓這一項最大就好了

設\[b=-s_ij+s_

\]\[s_ij+b=s_

\]這不是標準的斜率式嗎,把\((j,s_)\)看成點,\(s_i\)看成斜率找到乙個最優決策點就好了

自然凸殼上二分斜率了

第一次寫這個東西,細節不少

**

#include#include#include#include#define maxn 200005

#define re register

#define ll long long

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

#define min(a,b) ((a)<(b)?(a):(b))

ll s[maxn],pre[maxn];

ll ans=0;

int q[maxn],h=1,t,n;

inline ll x(int i)

inline ll y(int i)

inline double k(int a,int b)

inline void ins(int x)

printf("%lld\n",ans);

return 0;

}

A 小D的劇場 牛客練習賽40 dp

題目的意思就是長度為n的序列,每個位置可以選擇1 49的數字,但是連續的3個不能出現他不喜歡的三和弦所有排列,問有多少種滿足條件的序列。由於n很小使用dp求解,記錄當前位置和上一位使用了哪些數字,複雜度o 49 3 n 令d i j k 表示長度為i的序列最後一位為k倒數第二位為j的情況數量,在轉移...

牛客練習賽40

題目鏈結 c題 小a與尤拉路 先考慮迴路的情況。由於是一棵樹,任兩點間路徑只有一條,從一條邊走到深度更大的點,一定還會從同一條邊返回以回到起點或者遍歷其他子樹,所以每條邊需要複製一次,此時答案是邊權和的兩倍。不是迴路的情況可以減掉從終點回到起點的路徑,要讓這條路徑盡量長,所以長度一定是直徑的長度。答...

牛客練習賽40 題解(部分)

官方題解 a 小d的劇場 大概意思就是,有1 49個數,代表著不同的音符,問你能組成長度為n的串有多少種 mod 109 7 有若干個限制,比如1 2 3,就是1,2,3不能放在一起,然後問你在這些限制下有多少種不同的長度為n的串。3 n 500,0 q 117649,1 a,b,c 49 思路 看...