題面
考場上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...