[ah2017/hnoi2017]禮物
標籤: ntt
有兩個手鍊, 這兩個手鍊上分別有 \(n\) 個裝飾品, ( \(1 \le n \le 5 \times 10^4\) ).
每個裝飾品都有乙個亮度, 兩個手鍊上裝飾品的亮度分別為 \(a_i,\ b_i\), 且 \(1 \le a_i,\ b_i \le m\), (\(1 \le m \le 100\)).
現可以將乙個手鍊上的所有裝飾品的亮度值增加乙個非負正數 \(c\), 並可以將手鍊進行旋轉, 使得
\[\sum_^ (a_i-b_i)^2
\]最小, 並求出這個最小值
為了描述方便, 我們把 $ \sum_^ (a_i-b_i)^2 $ 這個式子稱作 "亮度差".
現考慮把乙個手鍊的亮度值增加 \(c\) 後, 亮度差會如何變化,
前後亮度差的差值為
\[\begin
\sum_^ [(a_i+c)-b_i]^2 - \sum_^ (a_i-b_i)^2
&= \sum_^ c^2 + \sum_^ 2a_ic - \sum_^ 2b_ic \\
&= nc^2 + 2c\sum_^ (a_i - b_i) \\
\end
\]驚奇地發現, 無論裝飾品的對應關係如何, 即不管手鍊如何旋轉, 亮度差的變化值是一定的, 並且是關於亮度增加值 \(c\) 的乙個二次函式, 可以直接求得最小值.
這樣的話, 我們就只需要考慮如何旋轉手鍊能使得初始亮度差最小.
初始亮度差為,
\[\sum_^ (a_i - b_i)^2 = \sum_^ (a_i^2 + b_i^2) - 2\sum_^ a_ib_i
\]要是上述式子最小, 就需要求到 \(\sum_^ a_ib_i\) 的最大值.
我們把序列 \(a\) 翻轉, 使得 \(a_i = a_\), 那麼上述式子就變為 \(\sum_^ a_ b_i\), 是乙個加法卷積的形式.
我們把 \(a\) 倍長, 並與 \(b\) 進行一次卷積, 那麼卷積結果 \(c\) 的第 \(n + i\) 位就是 \(a\) 從第 \(i\) 位開始與 \(b\) 相乘的結果, 就是題目中的將 \(a\) 旋轉了 \(i - 1\) 次. 所以我們 ntt 後取 \(n + 1 \sim 2n\) 的最大值即可.
#include#define ll long long
#define db double
using namespace std;
const int _=3e5+7;
const int p=998244353;
const int rt=3;
bool be;
int n,m,a[_],b[_],f[_],g[_],t,invt,invrt,num[_];
bool en;
int q_pow(int a,int k)
return res;
}void ntt(int *f,int id)
for(int i=1;i<=n;i++)
int a=-n,b=2*(a[0]-b[0]);
db tmp=(db)-b/(2*a);
db t1=tmp-floor(tmp),t2=ceil(tmp)-tmp;
int c= t1>1]>>1)|((i&1) ?t>>1 :0);
ntt(f,1);
ntt(g,1);
for(int i=0;intt(f,-1);
ll ans=-0x3f3f3f3f,res=0;
for(int i=n+1;i<=2*n;i++) ans=max(ans,(ll)f[i]*invt%p);
for(int i=1;i<=n;i++) res+=a[i]*a[i]+b[i]*b[i];
ans=res-2*ans-c;
printf("%lld\n",ans);
// printf("\nused space: %.2lfmb\n",(&en-&be)/1048576.0);
return 0;
}
題解 AH2017 HNOI2017 禮物
problem 設旋轉好後我們加的值是 c.sum n a i b i c 2 sum a i 2 b i 2 c 2 2a ib i 2a ic 2b ic 這個式子除了 sum 2a ib i 都是定值。考慮求這個東西的最大值。把 2 扔了,原式 sum a ib i 反轉 a 得到 sum a...
雅禮集訓 2017 價
傳送門 乙個不太顯然的最小割做法。我們這麼連邊 源點向藥物連 infty p i 容量的邊,藥物向它對應的藥材連 infty 容量的邊,藥材向匯點連 infty 容量的邊。用源點的流量減去最小割,再負回來就可以求出答案了。怎麼理解呢?割掉一條邊表示不選其對應的藥物或藥材,我們發現最後的方案一定是完美...
2017國慶雅禮集訓 長沙雅禮划水記
一題給出數軸上 n 個座標xi 有權值w i 求由 x i xj wi wj 連邊構成的最大團。這個式子長得太像兩圓相離或外切的表示了 連數軸都告訴你了呀 於是瞬間變成取最多不重區間的水題。然而我居然忘了還有右端點排序後o n 的簡單貪心,寫了個o n2 的dp加二分優化 我太鹹啦 好在總複雜度還是...