洛谷U138580 簡單的打擊

2022-06-13 15:12:09 字數 1300 閱讀 6174

幫助統治者解決問題之後,統治者準備獎勵你兩把劍,讓你去打怪。

具體的來說,兩把劍分別代表了兩個長度為 \(n\) 的序列 \(a,b\)。

你什麼方面都強,所以你可以分別重新鍛造這兩把劍,鍛造就相當於重新排列這兩個序列。

合併這兩把劍,讓它變成一把新劍(對應序列 \(c\)),合併相當於把對應位置上的數加起來 \(c[i]=a[i]+b[i]\)。

最後你準備拿著這把新劍去找大 boss,造成的傷害是眾數出現的次數。

問怎麼排列才能使得傷害最大化,輸出最大傷害。

設 \(a[i],b[i]\) 分別表示序列一 / 二中,數字 \(i\) 出現的次數。\(ans[i]\) 表示中位數為 \(i\) 的答案。

那麼顯然有

\[ans[i]=\sum^_\min(a[j],b[i-j])

\]我們發現這個式子很像卷積,但是並不可以直接把它們卷起來。

發現 \(\min(a,b)=\sum_[a\geq k][b\geq k]\),所以我們可以得出

\[ans[i]=\sum^_\sum_\ [a[j]\geq k][b[i-j]\geq k]

\]直接實現是 \(o(nm\log n)\) 的,其中 \(m\) 是值域,這樣還沒有暴力優秀。

但是可以發現值超過 \(t\) 的 \(a[i],b[i]\) 數量不超過 \(\lfloor\frac\rfloor\) 個。所以我們可以考慮分段亂搞。

所以總時間複雜度 \(o(tn\log n+\frac)\)。考慮到 fft 的常數巨大,這裡取 \(t=5\)。

#include #define cp complexusing namespace std;

typedef long long ll;

const int n=400010,t=5;

const double pi=acos(-1);

int n,m1,m2,lim,a[n],b[n],c[n],d[n],rev[n];

ll maxn,ans[n];

cp f[n],g[n];

int read()

void fft(cp *f,int tag)

for (int i=1;i<=m1;i++)

for (int j=1;j<=m2;j++)

ans[c[i]+d[j]]+=min(a[c[i]],b[d[j]])-t;

for (int i=0;i<=lim;i++) maxn=max(maxn,ans[i]);

printf("%lld",maxn);

return 0;

}

洛谷 U140112 Seawayson的趣味題

洛谷傳送門 seawayseawa y博士是mt 我叫mt,一款遊戲 領域的知名專家,他的兒子名叫seawaysonseawayson。現在,剛剛放學回家的seawaysonseawayson正在思考乙個有趣的問題。今天在資訊學課堂上,老師講解了關於進製的知識。老師向他們介紹了二進位制以及二進位制的...

洛谷 U85556 教官的遊戲

洛谷傳送門 題目背景 seawayseaway和iamrjjiamrjj一起被萬惡的分班考試分到了高一 66班,當然了,他們要參加軍訓。在訓練場上,教官帶66班玩了個小遊戲.題目描述 有這樣的乙個經典小遊戲 大家從11開始依次數數,數到77的倍數或者數字中帶77的數就拍手。而教官的遊戲是這樣的 因為...

洛谷 U16580 奇怪的根式

選自一道初中奧數題 1 2 sqrt 1 sqrt 2 1 3 sqrt 2 2 sqrt 3 1 4 sqrt 3 3 sqrt 4 1 n 1 sqrt n n sqrt n 1 我們先研究一下通項 可以發現 1 n 1 sqrt n n sqrt n 1 1 sqrt n sqrt n 1 s...