codeforces 622c Not Equal on a Segment

询问区间内不等于某个指定数的任意一个数的下标。

可以用数据结构来降低复杂度,不过我没有成功,题解提供了一种非常专业的思路:

数组 p 中的元素 p[ i ] 表示 a[ i ] 的左边的第一个不等于 a[ i ]的元素的下标

 

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<unordered_map>
#define DEBUG(x) cout<<#x<<" = "<<x<<endl
using namespace std;
const int MAXN=2e5+10;
int n,m;
int a[MAXN];
int p[MAXN];
int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    ///p表示从a[i]开始第一个不等于a[i]的值的位置
    for(int i=2;i<=n;i++){
        if(a[i]==a[i-1])p[i]=p[i-1];
        else p[i]=i-1;
    }
    while(m--){
        int l,r,x;
        scanf("%d%d%d",&l,&r,&x);
        int ans;
        if(a[r]!=x)ans=r;
        else {
            if(p[r]<l)ans=-1;
            else ans=p[r];
        }
        printf("%d\n",ans);
    }
}

 

posted @ 2018-10-12 16:17  MalcolmMeng  阅读(194)  评论(0编辑  收藏  举报