P11157 【MX-X6-T3】さよならワンダーランド题解
Eternal_crystal · · 题解
solution
机房大佬的超绝做法@A1234467
不难发现,数组的最大值是最容易得到答案的,那么我们可以将其预处理出来。
但是又不能保证答案都在最大值处,设最大值为
综上,先判断最大值是否为答案,再扫一遍区间即可,可以证明在随机数据下时间复杂度保证。
code:
#include<bits/stdc++.h>
using namespace std;
const int N = 300005;
int n, a[N], maxx = INT_MIN, pos;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
int main(){
n = read();
for(int i = 1;i <= n;i++){
a[i] = read();
if(maxx <= a[i]){maxx = a[i], pos = i;}
}
for(int i = 1; i <= n; ++i) {
int ans = INT_MIN;
if(a[i] <= pos - i && pos - i <= maxx) ans = pos - i;
if(ans == INT_MIN)
for(int j = std::max(1 - i, a[i]); j <= std::min(n - i, maxx); ++j)
if(j <= a[i + j]) {ans = j; break;}
if(ans != INT_MIN) printf("1 %d\n", ans);
else printf("0\n");
}
return 0;
}