题意: 问在给定序列中是否存在三个数按照顺序成等差数列。
如果直接套循环找的话,复杂度比O(n^2)还要大,接受不了。
那么我们不妨换个思路,从小到大枚举等差级数d,等到第三个数不再1~n-1的范围内时退出枚举下一个数就行了。
至于为什么我没有枚举负数值d,我猜测是如果存在递减的等差数列,那么一定也存在一个递增的,要不然就是数据有漏洞,希望知道答案的朋友能够告诉我。
细节参见代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1000000000;
const int maxn = 50000+5;
int n,m,a[maxn],vis[maxn];
char s[100];
int main() {
while(~scanf("%s",s)) {
if(s[0] == '0') break;
n = 0; int len = strlen(s);
for(int i=0;i<len;i++) {
if(s[i] == ':') break;
else n = n * 10 + s[i] - '0';
}
for(int i=0;i<n;i++) {
scanf("%d",&a[i]);
vis[a[i]] = i;
}
bool ok = false;
for(int i=0;i<n;i++) {
int d = 1;
while(true) {
if(a[i]+2*d >= n) break;
if(vis[a[i]+d] > i && vis[a[i]+2*d] > vis[a[i]+d]) { ok = true; break; }
++d;
}
if(ok) break;
}
if(ok) printf("no\n");
else printf("yes\n");
}
return 0;
}