• zoj3633


     1 /*
     2 题意:n个数的序列,m个询问,每次询问给你区间[l,r]问是否区间内有两个相同的数;
     3 如果没有输出OK,有的话输出最右边满足的数的值;
     4 
     5 分析:从左到右扫描一遍,给每个数记录它左边最近的相同数的标号,
     6 那么区间[l,r]最大的标号如果还小于l那么就不存在相同的数;
     7 用线段树维护,顺便记录下该数的下标;
     8 
     9 
    10 */
    11 #include<cstdio>
    12 #include<cstring>
    13 #include<cstdlib>
    14 #include<iostream>
    15 #include<cmath>
    16 #include<algorithm>
    17 #include<map>
    18 #define lson l,m,rt<<1
    19 #define rson m+1,r,rt<<1|1
    20 using namespace std;
    21 const int N=500000+10;
    22 int mx[N<<2],id[N<<2],a[N],b[N];
    23 map<int,int > mp;
    24 void pushup(int rt){
    25     if (mx[rt<<1]<=mx[rt<<1|1]){
    26         mx[rt]=mx[rt<<1|1];id[rt]=id[rt<<1|1];
    27     }else {
    28         mx[rt]=mx[rt<<1];id[rt]=mx[rt<<1];
    29     }
    30 }
    31 void build(int l,int r,int rt){
    32     mx[rt]=id[rt]=-1;
    33     if (l==r) {
    34         mx[rt]=b[l];
    35         id[rt]=l;
    36         return;
    37     }
    38     int m=(l+r)>>1;
    39     build(lson);build(rson);
    40     pushup(rt);
    41 }
    42 typedef pair<int,int> pii;
    43 pii query(int L,int R,int l,int r,int rt){
    44     if (L<=l && r<=R){
    45         return make_pair(mx[rt],id[rt]);
    46     }
    47     int m=(l+r)>>1;
    48     pii u(-1,-1),v(-1,-1);
    49     if (L<=m) u=query(L,R,lson);
    50     if (m< R) v=query(L,R,rson);
    51     if (u.first<=v.first) return v;
    52     else return u;
    53 }
    54 int n,m;
    55 int main(){
    56     while (~scanf("%d",&n)){
    57         for (int i=0;i<n;i++) scanf("%d",&a[i]);
    58         mp.clear();
    59         for (int i=0;i<n;i++){
    60             if (mp.find(a[i])==mp.end()){
    61                 mp[a[i]]=i; b[i]=-1;
    62             }
    63             else {
    64                 b[i]=mp[a[i]];
    65                 mp[a[i]]=i;
    66             }
    67         }
    68         build(0,n-1,1);
    69       //  cout<<mx[1]<<" "<<id[1]<<endl;
    70         scanf("%d",&m);
    71         for (int i=0;i<m;i++){
    72             int x,y;scanf("%d%d",&x,&y);
    73             x--,y--;
    74             pii ret=query(x,y,0,n-1,1);
    75             if (ret.first>=x) printf("%d\n",a[ret.second]);
    76             else printf("OK\n");
    77         }
    78         printf("\n");
    79     }
    80 }
  • 相关阅读:
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS博客作业01--线性表
    C博客作业05--指针
    C语言博客作业04--数组
    C博客作业03--函数
    博客作业——循环结构
    C博客作业05-指针
    C博客作业04--数组
  • 原文地址:https://www.cnblogs.com/Rlemon/p/3091737.html
Copyright © 2020-2023  润新知