链接

链接

思路

好久之前的考试题了吧,之前貌似抄的题解
现在理解了怕忘了,就写个题解记录一下吧,题目还是不错的
枚举中间点j
\[H_{i}-H_{j}=H_{j}-H_{k}\]
\[H_{k}+H_{i}=2*H_{j}\]
由于H是一种n的排列,所以取值就是\([1,n]\)
那就可以求出\(H_{k}\)\(H_{k}\)的取值范围来了(处理一下边界,稳得一批)
如果取值范围内出现的数字的个数是奇数,那就说明还有一个数字在后面
这样就能A啦
还有一种是
求出取值范围内的数字的和
然后$ %2*H_{i}$
如果不是0,说明成立,参见上面式子
这里只提供第一种代码,第二种自己写吧

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+7;
int n,a[maxn];
int lowbit(int x) {return x&-x;}
struct node {
    int sum[maxn];
    void add(int x,int ad) {
        for(;x<=n;x+=lowbit(x)) sum[x]+=ad;
    }
    int query(int x) {
        int ans=0;
        for(x;x>=1;x-=lowbit(x)) ans+=sum[x];
        return ans;
    }
}tree;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    for(int i=1;i<=n;++i) {
        int L=max(1,2*a[i]-n);
        int R=min(n,2*a[i]-1);
        if((tree.query(R)-tree.query(L-1)) & 1) return puts("YES"),0;
        tree.add(a[i],1); 
    }
    puts("NO");
    return 0;
}