原题连接:https://cn.vjudge.net/contest/298281
B - Element Swapping
ZOJ - 4101
题意:数组a通过交换一对值得到数组b,且已知
x=
∑
i
=
1
n
i
∗
a
[
i
]
\sum_{i=1}^ni*a[i]
∑i=1ni∗a[i]和y=
∑
i
=
1
n
i
∗
a
[
i
]
∗
a
[
i
]
\sum_{i=1}^ni*a[i]*a[i]
∑i=1ni∗a[i]∗a[i] 和交换后的数组b,
求原来被交换的可能对数。
题解:用数组b求出交换后的x1=
∑
i
=
1
n
i
∗
b
[
i
]
\sum_{i=1}^ni*b[i]
∑i=1ni∗b[i]和y1=
∑
i
=
1
n
i
∗
b
[
i
]
∗
b
[
i
]
\sum_{i=1}^ni*b[i]*b[i]
∑i=1ni∗b[i]∗b[i]
那么
(
y
−
y
1
)
/
(
x
−
x
1
)
(y-y1)/(x-x1)
(y−y1)/(x−x1)就是对应被交换的两个数
(
v
a
l
1
+
v
a
l
2
)
∗
k
(val1+val2)*k
(val1+val2)∗k,其中k为他们两个数下标的距离差值,详见代码
#include
#include
#include
#include
#include
using namespace std;
#define ll long long
const int maxn=100010;
int n;
int a[maxn];
ll x,y,x2,y2;
int c[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d%lld%lld",&n,&x,&y);
x2=y2=0LL;
for(int i=0;i0&&yy
关注
打赏
