AH2017 HNOI2017 禮物 解題報告

2022-04-07 10:02:05 字數 2053 閱讀 9335

[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加二分優化 我太鹹啦 好在總複雜度還是...