2018雅禮集訓1 12 小C飲水記

2021-08-14 14:26:54 字數 1550 閱讀 5979

題面

考場上sb用set,式子還沒化成o(

t)的,總複雜度o(

ntlogn+n

t2) ,70分滾粗。。。

首先對於一段長度為

k 區間,假設按w1

,...

,wk的順序來選,貢獻為 ∑i

=1kw

i2i

所以顯然要按從大到小的順序來選,然後發現本題不要求取模,所以當

i 很大時,wi

的貢獻就可以忽略不計了。所以我們只關心區間中前

t 大的數,t=

30左右。

這樣的複雜度還是不能接受,考慮對於每乙個wi

,計算其在所有區間中的貢獻。我們按wi

從小到大的順序來考慮,用鍊錶找到其左邊

t 個和右邊

t個比它大的,設為

l1..t 和

r1..

t ,為了方便設l0

=r0=

i ,於是其貢獻為 wi

∑x=1

t∑y=

1t(l

x−1−

lx)∗

(ry−

ry−1

)∗12

x+y−

1 =2

wi(∑

x=1t

(lx−

1−lx

)∗12

x)(∑

y=1t

(ry−

ry−1

)∗12

y)處理完從鍊錶中刪掉這個元素即可。複雜度o(

nlogn+

nt) 。

**:

#include

#include

#include

#include

#include

#define pii pair

#define fs first

#define sc second

using

namespace

std;

const

int maxn=1000010;

const

int r=32;

int n,l[r+5],r[r+5],pre[maxn],suc[maxn];

pii w[maxn];

set a;

double mi[r+5],ans=0;

int read()

int main()

double lans=0,rans=0;

for(int j=1;j<=ltop;j++) lans+=mi[j]*(l[j-1]-l[j]);

for(int j=1;j<=rtop;j++) rans+=mi[j]*(r[j]-r[j-1]);

ans+=lans*rans*2*w[i].fs;

pre[suc[w[i].sc]]=pre[w[i].sc];

suc[pre[w[i].sc]]=suc[w[i].sc];

}printf("%.10lf",ans/n/n);

return

0;}

雅禮集訓 小C飲水記

標籤 鍊錶,貪心 暴力做法 貪心,對於每個區間,從大到小排序,顯然,wi大的對答案貢獻越大 時間複雜度o n 3 log n 正解 因為題目輸出實數,所以當交換次數到一定時候,對答案的影響可以忽略不計 這個t大約是30次 對每個wi的貢獻單獨計算 每個wi只對相鄰的t個產生貢獻,所以取前後各t個 計...

雅禮集訓 小C的線段樹

標籤 dp 輸出0可以騙到5分 出題人說這是最簡單的一題,果然題目順序和難度無關qwq 當n m時不存在合法的序列,所以答案為0 我們可以將區間 l,r 看成括號匹配 位置i最終的值就是左邊的左括號數量減去左邊的右括號數量 設f i l r 表示i位置左邊有l個左括號,r個右括號的方案數,ans i...

雅禮集訓 2018 Day4 Magic

傳送門本部分 於 這位大佬 題中要求本質不同的序列數量,不太好搞。我們考慮給相同顏色的牌加上編號,這樣所有牌都不相同。那麼如果我們求出了答案,只需要將答案除以 prod a i 就好了。恰好有 k 對 不能直接求,考慮容斥,如果我們求出了 g x 表示至少有 x 對的方案數,那麼答案即為 sum l...