zoukankan      html  css  js  c++  java
  • 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
    ", r + 1);
    35         }
    36         else
    37         {
    38             if (p[r] != -1 && p[r] >= l)
    39             {
    40                 printf("%d
    ", p[r] + 1);
    41             }
    42             else
    43             {
    44                 puts("-1");
    45             }
    46         }
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    oracle的nvl函数的用法
    简单实用的MD5加密算法
    oracle触发器使用笔记
    Html学习
    连接字符串
    oracle触发器使用笔记2
    oracle中如何给有空值的数据排序
    Zend Frame 添加Smarty模板引擎
    HDU 2464 A Pair of Graph
    POJ 1466 Girls and Boys
  • 原文地址:https://www.cnblogs.com/wangyiming/p/6223925.html
Copyright © 2011-2022 走看看