题解:CF2110F Faculty
qqqaaazzz_qwq · · 题解
比赛结束前
先来挖掘一下这个
-
(x \bmod y) + (y \bmod x) = (x \bmod y) + y \geq y -
-
(x \bmod y) + (y \bmod x) \leq x-y+y \leq x
总结:
设前缀最大值为
然后这道题就基本做完了,下面是代码:
#include <bits/stdc++.h>
#define FAST ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
int a[1000010];
int n;
int f(int x,int y){
return x%y+y%x;
}
void solve(){
cin >> n;
for (int i=1;i<=n;i++) cin >> a[i];
int mx = 0,ans = 0;
for (int i=1;i<=n;i++){
if(a[i]>=mx*2){
mx = a[i];//暴力更新,做多发生 log V 次
ans = 0;
for (int j=1;j<=i;j++) ans = max(ans,f(a[i],a[j]));
}
else if(a[i]>mx){
ans = a[i];//f(a[i],mx) = mx + a[i] - mx
mx = a[i];
}
else ans = max(ans,f(a[i],mx));
cout << ans << " ";
}
cout << "\n";
}
signed main()
{
int t;
cin >> t;
while(t--) solve();
return 0;
}