• C. Not Equal on a Segment(codeforces)


    C. Not Equal on a Segment
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You are given array a with n integers and m queries. The i-th query is given with three integers li, ri, xi.

    For the i-th query find any position pi (li ≤ pi ≤ ri) so that api ≠ xi.

    Input

    The first line contains two integers n, m (1 ≤ n, m ≤ 2·105) — the number of elements in a and the number of queries.

    The second line contains n integers ai (1 ≤ ai ≤ 106) — the elements of the array a.

    Each of the next m lines contains three integers li, ri, xi (1 ≤ li ≤ ri ≤ n, 1 ≤ xi ≤ 106) — the parameters of the i-th query.

    Output

    Print m lines. On the i-th line print integer pi — the position of any number not equal to xi in segment [li, ri] or the value  - 1 if there is no such number.

    Sample test(s)
    input
    6 4
    1 2 1 1 3 5
    1 4 1
    2 6 2
    3 4 1
    3 4 2
    output
    2
    6
    -1
    4
    思路:求要询问的区间的最大和最小数,求出它们的下标,和所问的数比较,如果两个都和之相等则在这个区间无和他不同的,否则取最大和最小与之不同的下标即可,用线段树去维护每个区间最大最小值
    复杂度为(n*logn);
      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<iostream>
      4 #include<string.h>
      5 #include<stdlib.h>
      6 #include<math.h>
      7 #include<cstdio>
      8 #include<queue>
      9 #include<stack>
     10 #include<map>
     11 int ask(int l,int r,int aa,int bb,int k);
     12 int ask1(int l,int r,int aa,int bb,int k);
     13 void build(int l,int r,int k);
     14 using namespace std;
     15 typedef long long ll;
     16 int tree[1000000];
     17 int tree2[1000000];
     18 int a[400005];
     19 int main(void)
     20 {
     21     int i,j,k,p,q;
     22     tree[0]=0;
     23     int nn,mm,kk;
     24     while(scanf("%d %d",&p,&q)!=EOF)
     25     {
     26         for(i=1; i<=p; i++)
     27         {
     28             scanf("%d",&a[i]);
     29         }
     30         build(1,p,0);
     31         while(q--)
     32         {
     33             scanf("%d %d %d",&nn,&mm,&kk);
     34             a[0]=0;
     35             int maxxid=ask(nn,mm,1,p,0);
     36             a[0]=1e8;
     37             int minnid=ask1(nn,mm,1,p,0);
     38             int maxx=a[maxxid];
     39             int minn=a[minnid];
     40             if(kk==maxx&&kk==minn)
     41             {
     42                 printf("-1
    ");
     43             }
     44             else
     45             {
     46                 if(kk!=maxx)
     47                 {
     48                     printf("%d
    ",maxxid);
     49                 }
     50                 else printf("%d
    ",minnid);
     51             }
     52         }
     53     }
     54     return 0;
     55 }
     56 
     57 void build(int l,int r,int k)
     58 {
     59     if(l==r)
     60     {
     61         tree[k]=l;
     62         tree2[k]=l;
     63         return ;
     64     }
     65     else
     66     {
     67         build(l,(l+r)/2,2*k+1);
     68         build((l+r)/2+1,r,2*k+2);
     69         tree[k]=a[tree[2*k+1]]>a[tree[2*k+2]]?tree[2*k+1]:tree[2*k+2];
     70         tree2[k]=a[tree2[2*k+1]]<a[tree2[2*k+2]]?tree2[2*k+1]:tree2[2*k+2];
     71     }
     72 }
     73 int ask(int l,int r,int aa,int bb,int k)
     74 {
     75     if(l>bb||r<aa)
     76     {
     77         return 0;
     78     }
     79     else if(l<=aa&&r>=bb)
     80     {
     81         return tree[k];
     82     }
     83     else
     84     {
     85         int ll=ask(l,r,aa,(aa+bb)/2,2*k+1);
     86         int uu=ask(l,r,(aa+bb)/2+1,bb,2*k+2);
     87         return a[ll]>a[uu]?ll:uu;
     88     }
     89 
     90 }
     91 int ask1(int l,int r,int aa,int bb,int k)
     92 {
     93     if(l>bb||r<aa)
     94     {
     95         return 0;
     96     }
     97     else if(l<=aa&&r>=bb)
     98     {
     99         return tree2[k];
    100     }
    101     else
    102     {
    103         int ll=ask1(l,r,aa,(aa+bb)/2,2*k+1);
    104         int uu=ask1(l,r,(aa+bb)/2+1,bb,2*k+2);
    105         return a[ll]<a[uu]?ll:uu;
    106     }
    107 }
    油!油!you@
  • 相关阅读:
    [luogu]P1852跳跳棋
    StdDraw绘图
    Java-Timer-Stop
    人之初
    单例模式--延时初始化
    ubuntu忘记密码
    QT5 TK1 串口通信
    金秋十月
    级联分类器训练-----OpenCV
    Hu矩SVM训练及检测-----OpenCV
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5186754.html
Copyright © 2020-2023  润新知