Codeforces Round #720 (Div. 2) B. Nastia and a Good Array(1300)
-
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;
#define int long long
const int N = 1e5+10;
int a[N];
void solve(){
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;};}
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;
}
}
signed main(){
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}
|