題目描述:小 d 有一些同樣長的木棍,然後每個都切成長度分別不超過 \(m\) 的兩段。現在想拼回去,但是小 d 遺失了一部分木棍,而且還忘了它們的長度和個數,所以他想拼接出盡可能多的相同長度的木棍。給出每段小木棍的長度,求盡可能多的木棍個數和此時的木棍最小長度。
資料範圍:\(2\le n,m\le 10^5,1\le a_i\le m\)
開桶 \(\\)
\[\begin
ans_x&=\frac12\sum_\min(b_i,b_j) \\
&=\sum_k\sum_[b_i\ge k][b_j\ge k]
\end
\]使用 fft,成功得到了乙個 \(o(nm\log m)\) 的比暴力還lj的做法。
但是你發現 \(\sum b_i=n\le 10^5\),所以你可以"閾值法"(?),定乙個數 \(t\),當 \(k\le t\) 時用 fft 計算,\(b_i>t\) 的數不超過 \(\frac nt\) 個,所以時間複雜度是 \(o(tm\log m+(\frac nt)^2)\)。
我不會算函式最值,純粹喜歡 \(t=10\) 而已(草)。
#include#define rint register int
using namespace std;
const int n = 1 << 18, b = 10;
const double pi = acos(-1);
int n, m, a[n], b[n], tot, f[n], now, ans;
templateinline void read(t &x)
struct comp
inline comp operator + (const comp &o) const
inline comp operator * (const comp &o) const
inline comp operator - (const comp &o) const
inline comp operator ~ () const
} w[2][n], a[n];
int rev[n], lim;
inline void calrev(int len)
for(rint i = 0;i < lim;++ i) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l);
for(rint mid = 1;mid < lim;mid <<= 1)
for(rint i = 0;i < mid;++ i) w[1][mid + i] = ~(w[0][mid + i] = comp(cos(pi / mid * i), sin(pi / mid * i)));
}void fft(comp *a, int op)
if(op) for(rint i = 0;i < lim;++ i) a[i].x /= lim;
}int main()
for(rint i = 1;i <= m;++ i)
for(rint i = 1;i <= tot;++ i)
for(rint j = 1;j <= tot;++ j) f[b[i] + b[j]] += min(a[b[i]], a[b[j]]);
for(rint i = 1;i <= (m << 1);++ i) if(f[i] > f[ans]) ans = i;
printf("%d %d\n", f[ans] >> 1, ans);
}
6 30學習筆記
border radius屬性 在css3中可以使用border radius進行圓角邊框的繪製,在網頁中呢,我們經常使用圓角邊框來美化我們 的頁面,在css3出現之前呢 我們如果要在網頁上展示乙個圓角邊框的一 個效果,那麼我們需要繪製圖形 在css3出現之後呢我們就只需要 段簡單的 就可以實現圓角...
普通 隨筆 6 30
2015年的一半差幾個小時也要過去了。貌似今晚是多加了一秒 閏秒 今晚可以多睡一秒了 然並卵 自從某acm金牌師兄來講了次網路流後,自己也停止bzoj的刷題了,專心學各種新演算法。於是就整理出了這麼長的列表。這些都是我不會的。大概90多項吧。頓時覺得oi之路極其漫長。自從用了xmind之後好多題解也...
Elasticsearch6 3 0學習筆記(二)
先準備測試資料,es有提供有關批量執行的方式 bulk 參考 但是在postman中插入式異常,所以暫時使用單條插入的方式 put localhost 9200 movies movie 1 put localhost 9200 movies movie 2 put localhost 9200 m...