CF622C Not Equal on a Segment
Posted 王宜鸣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF622C Not Equal on a Segment相关的知识,希望对你有一定的参考价值。
题目链接:
http://codeforces.com/problemset/problem/622/C
题目大意:
给定一个长度为n(n不超过200000)的序列,有m(m不超过200000)次询问,第i次询问一个区间[li,ri]内是否存在一个数不等于一个给定值x。如果存在,就输出这个数的位置,否则输出-1。
解题思路:
预处理一个数组p[n]。p[i]表示从位置i向左一直到位置0,第一个不等于a[i]的数的位置。可以以o(n)的复杂度通过对递推实现。具体来说就是首先令p[0]=-1,然后从左向右递推,若a[i - 1] != a[i],则p[i] = i - 1,否则p[i] = p[i - 1]。
查询的时候首先检查a[r]是否等于x。若不等于则找到一个解r;否则检查p[r]即可。
代码:
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 int a[1000005]; 6 int p[1000005]; 7 int n, t, l, r, x; 8 void init() 9 { 10 p[0] = -1; 11 for (int i = 1; i < n; i++) 12 { 13 if (a[i] != a[i - 1]) 14 p[i] = i - 1; 15 else 16 p[i] = p[i - 1]; 17 } 18 } 19 int main() 20 { 21 cin >> n >> t; 22 for (int i = 0; i < n; i++) 23 { 24 scanf("%d", &a[i]); 25 } 26 init(); 27 while (t--) 28 { 29 scanf("%d %d %d", &l, &r, &x); 30 l--; 31 r--; 32 if (a[r] != x) 33 { 34 printf("%d\n", r + 1); 35 } 36 else 37 { 38 if (p[r] != -1 && p[r] >= l) 39 { 40 printf("%d\n", p[r] + 1); 41 } 42 else 43 { 44 puts("-1"); 45 } 46 } 47 } 48 return 0; 49 }
以上是关于CF622C Not Equal on a Segment的主要内容,如果未能解决你的问题,请参考以下文章
CF600B Queries about less or equal elements 题解 二分
CodeForces - 1620A Equal or Not Equal