#Description
给定两个长度都为N的数列A,B,A,B内部元素可以以任意顺序排列
令
C
i
=
A
i
+
B
i
C_i=A_i+B_i
Ci=Ai+Bi
求所有排列方案中,使得
C
C
C中的众数的出现次数最多是多少,输出最多的出现次数以及这个众数(如有多个取较大者)
3
<
=
n
<
=
100000
,
A
i
,
B
i
<
=
100000
3<= n <=100000,A_i,B_i<=100000
3<=n<=100000,Ai,Bi<=100000
#Analysis
显然我们只需要关心每个数在A,B中的出现次数
令
a
[
i
]
a[i]
a[i]表示i在A中的出现次数,
b
[
i
]
b[i]
b[i]同理,
c
[
i
]
c[i]
c[i]为可能的
C
C
C中i的出现最多次数
显然
c
[
i
]
=
∑
j
∑
k
m
i
n
(
a
j
,
b
k
)
[
j
+
k
=
i
]
c[i]=\sum_{j}\sum_k min(a_j,b_k)[j+k=i]
c[i]=∑j∑kmin(aj,bk)[j+k=i]
发现这个
m
i
n
min
min不太好办
考虑转化,
c
[
i
]
c[i]
c[i]可以表示满足下列条件的三元组
(
p
,
q
,
k
)
(p,q,k)
(p,q,k)的数量:
p
+
q
=
i
,
a
[
p
]
>
=
k
,
b
[
q
]
>
=
k
p+q=i,a[p]>=k,b[q]>=k
p+q=i,a[p]>=k,b[q]>=k
可以发现当
k
k
k较大时,满足
a
[
p
]
>
=
k
,
b
[
q
]
>
=
k
a[p]>=k,b[q]>=k
a[p]>=k,b[q]>=k的
p
,
q
p,q
p,q数量不超过
n
/
k
n/k
n/k,因此可以
O
(
(
n
/
k
)
2
)
O((n/k)^2)
O((n/k)2)暴力计算
当
k
k
k较小时,也可以暴力,枚举
1
到
k
1到k
1到k,将贡献分离开就是个裸的多项式乘法了,用FFT优化可以做到
O
(
k
n
l
o
g
n
)
O(knlogn)
O(knlogn)
合理确定
k
k
k 的范围即可通过此题
【srm603】Sum Of Arrays
于 2017-12-08 12:27:08 首次发布