T118337.跃迁回路 题解(团队题)
2026-08-16 19:31:45
发布于:浙江
给团队的人看。
注意到可以dp,但是无论从哪里开始都无法使起点受到更新。
那我做两次不就行了?
因为第二次时的距离更长,肯定不会覆盖此前的结果,所以无妨。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> II;
typedef pair<ll, int> LI;
const int maxn = 1e5 + 10;
int n, f, m;
ll x, y, z;
vector<int> d, ans;
void solve1(){
for(int i = 1; i <= n; i++){
ans[i] = d[i];
}
ans[n] = max(ans[n], ans[1] - 1);
for(int i = n - 1; i > 0; i--){
ans[i] = max(ans[i], ans[i + 1] - 1);
}
ans[n] = max(ans[n], ans[1] - 1);
for(int i = n - 1; i > 0; i--){
ans[i] = max(ans[i], ans[i + 1] - 1);
}
int mi = 0;
ans[0] = 2e9;
for(int i = 1; i <= n; i++){
if(ans[i] < ans[mi]) mi = i;
}
cout << ans[mi] << ' ' << mi << endl;
}
int main(){
freopen("loop.in", "r", stdin);
freopen("loop.out", "w", stdout);
cin >> n >> f;
d = vector<int>(n + 1);
ans = vector<int>(n + 1);
if(f == 1){
for(int i = 1; i <= n; i++){
cin >> d[i];
}
solve1();
}else{
cin >> m >> x >> y >> z;
for(int i = 1; i <= m; i++){
cin >> d[i];
}
for(int i = m + 1; i <= n; i++){
d[i] = ((x*d[i-2] + y*d[i-1] + z) % 1000000000) + 1;
}
solve1();
}
end:
fclose(stdin);
fclose(stdout);
return 0;
}
这里空空如也



















有帮助,赞一个