B. Make Them Equal(Codeforces Round 673 (Div. 1))
传送门
题意:
思路:
首先判断是否能够操作达到目的:即所有的数都相等。
不能达到有两种情况:
1:所有数之和对n取余不等于0
2: 每个ai都是小于i的,例如n=5, a[]={0,1,2,3,4}。因为每个数都是小于 i 的,所以不能进行有效操作。
以上是输出-1的情况。
然后:操作次数是需要考虑的,也就是每个ai最多操作3次。,所以我们让所有除了a1的数都进行3次操作。如果不需要操作,我们就输出无关的操作,废物操作。也就是操作后转移0,例如:4 1 0,5 1 0,这种的。
大致想一下,我们可以把所有的数全部转移到a[1]。然后最后把a1向ai进行操作就行了。
如果一个
,那么只需要一次操作就能全部转移到a1。然后添加一个无关操作(1,1,0)。
如果
,那么我们先让a1对ai进行补数,达到
,这样包含一个操作
,然后再进行操作:把ai转移到a1
。
这样最后达到了数组是 {sum,0,0,0...};
然后对每个ai进行补数(sum/n),就行了。这样会发现刚好凑成了(n-1)*3次操作。
AC代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N];
void solve(){int n;cin>>n;int sum=0;int flag=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];if(a[i]>=i){flag=1;}}if(sum%n!=0||flag==0){cout<<"-1\\n";return ;}int num=sum/n;int l=2,r=2;cout<<(n-1)*3<<"\\n";while(r<=n){if(a[r]%r==0){cout<<1<<" "<<1<<" 0"<<"\\n";}else {cout<<"1 "<<r<<" "<<r-a[r]%r<<"\\n";a[r]+=r-a[r]%r;}cout<<r<<" 1 "<<a[r]/r<<"\\n"; a[1]+=a[r];r++;}int ll=2;while(ll<=n){cout<<"1 "<<ll<<" "<<num<<"\\n";ll++;}
}
signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;cin>>t;while(t--){solve();}
}