题解:P11157 【MX-X6-T3】さよならワンダーランド
题解:P11157 【MX-X6-T3】さよならワンダーランド
题意
为了便于分析题意,我们设
则问题变成:给定序列
-
1 \leq k \leq n -
a_i \leq k-i \leq a_k
分析
我们可以通过化简式子较严格地确定
-
1 \leq k - 由
a_i \leq k - i 得a_i+i \leq k
所以
再看上界:
-
k \leq n - 由
k-i \leq a_k 得k-a_k \leq i
我们可以用下界来缩小
首先如果
否则我们只需要确定是否有
这里
代码
没什么好说的了,先
//P11157 (AC)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef pair <int, int> pii;
int read()
{
int res = 0, f = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar())
if (ch == '-')
f = -1;
for (; isdigit(ch); ch = getchar())
res = (res << 3) + (res << 1) + (ch - '0');
return res * f;
}
const int N = 3e5 + 5;
const int INF = 0x3f3f3f3f;
int n;
int a[N];
int mi[N], mn[N];
int main()
{
int i, k;
n = read();
for (i = 1; i <= n; i ++)
a[i] = read();
mn[n + 1] = INF;
for (i = n; i >= 1; i --)
{
mn[i] = mn[i + 1];
mi[i] = mi[i + 1];
if (i - a[i] < mn[i])
{
mn[i] = i - a[i];
mi[i] = i;
}
}
for (i = 1; i <= n; i ++)
{
k = max(a[i] + i, 1);
if (i >= mn[k] && k <= n)
printf("1 %d\n", mi[k] - i);
else
printf("0\n");
}
return 0;
}