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); } }