1300
1300
1300构造卡了
1
1
1小时,题意在最多不超过
n
n
n次的操作下,每次操作选择两个下标不相等的数将
a
[
l
]
,
a
[
r
]
a[l],a[r]
a[l],a[r]变成
x
,
y
x,y
x,y其中
m
i
n
(
x
,
y
)
=
=
m
i
n
(
a
[
l
]
,
a
[
r
]
)
min(x,y)==min(a[l],a[r])
min(x,y)==min(a[l],a[r])。最终构造的数组中任意相邻数的
g
c
d
=
=
1
gcd==1
gcd==1
思路:找到数组中最小数的下标,因为操作的时候不要求相邻,所以我们可以通过
n
−
1
n-1
n−1次操作(除去他本身下标),将其左右两边数进行构造。例如当前下标为
i
d
x
idx
idx的数构造值为
a
b
s
(
i
d
x
−
p
o
s
)
+
a
[
p
o
s
]
abs(idx-pos)+a[pos]
abs(idx−pos)+a[pos],那么最终的数组就构造成了每相邻数的值差为
1
1
1,那么
g
c
d
gcd
gcd必然也为
1
1
1,总操作数
n
−
1
n-1
n−1同样符合要求。
代码:
#include<bits/stdc++.h>
using namespace std;#defineintlonglongconstint N =1e5+10;int a[N];voidsolve(){int n;
cin>>n;int ma=2e9;int pos;for(int i=1;i<=n;i++){cin>>a[i];if(ma>a[i]){ma=a[i],pos=i;};}//找到pos
cout<<n-1<<endl;for(int i=1;i<=n;i++){if(i!=pos)
cout<<pos<<' '<<i<<' '<<a[pos]<<' '<<abs(i-pos)+a[pos]<<endl;}}signedmain(){int T=1;
cin>>T;while(T--){solve();}return0;}
Codeforces Round #720 (Div. 2) B. Nastia and a Good Array(1300)
Codeforces Round #720 (Div. 2) B. Nastia and a Good Array(1300)Link130013001300构造卡了111小时,题意在最多不超过nnn次的操作下,每次操作选择两个下标不相等的数将a[l],a[r]a[l],a[r]a[l],a[r]变成x,yx,yx,y其中min(x,y)==min(a[l],a[r])min(x,y)==min(a[l],a[r])min(x,y)==min(a[l],a[r])。最终构造的数组中任意相邻数的gcd