Codeforces Round #673 (Div. 1)
A. k-Amazing Numbers
对于一个k有一个数满足是k-amazing即这个数之间的最大间隔不大于k
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 5;
const int INF=0x7f7f7f7f; //2139062143
void solve() {
int n;
cin>>n;
map<int ,pair<int ,int >>m;
for (int i = 1; i <=n; ++i) {
int x;
cin>>x;
if(m.find(x)==m.end()) m[x]=make_pair(i,i);
else {
m[x].second=max(m[x].second,i-m[x].first);
m[x].first=i;
}
}
vector<int > ans(n+1,INF);
for(auto x:m){
x.second.second=max(x.second.second,n+1-x.second.first);
ans[x.second.second]=min(ans[x.second.second],x.first);
}
int now=INF;
for (int i = 1; i <=n; ++i) {
now=min(now,ans[i]);
if (now==INF) cout<<"-1 ";
else cout<<now<<" ";
}
cout<<"\n";
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int _ = 1;
cin >> _;
while (_--) {
solve();
}
return 0;
}
B. Make Them Equal
先把除了1之外的所有数加到1上,在由1分配到其他数;
如果有的数不能整除下标 i 先通过 1 使其变为i的整数倍即可;
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 5;
const int INF=0x7f7f7f7f; //2139062143
int num[maxn];
void solve() {
int n;
cin>>n;
int sum=0;
for (int i = 1; i <=n; ++i) {
cin>>num[i];
sum+=num[i];
}
if(sum%n) cout<<-1<<"\n";
else{
sum/=n;
cout<<3*(n-1)<<"\n";
for (int i = 2; i <=n; ++i) {
int temp=i-num[i]%i;
if(temp==i) temp=0;
cout<<1<<" "<<i<<" "<<temp<<"\n";
num[1]-=temp;
num[i]+=temp;
cout<<i<<" "<<1<<" "<<num[i]/i<<"\n";
num[1]+=num[i];
num[i]=0;
}
for (int i = 2; i <=n; ++i)
cout<<1<<" "<<i<<" "<<sum<<"\n",num[i]+=sum,num[1]-=sum;
/*for (int i = 1; i <=n; ++i) {
cout<<num[i]<<" ";
}*/
}
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int _ = 1;
cin >> _;
while (_--) {
solve();
}
return 0;
}