zoukankan      html  css  js  c++  java
  • 区间检测

    区间检测(range

     

    Time Limit: 1S   Memory Limit: 128M

     

    Description
    给定一个长度为n的序列,进行m次检测,每次检测某个区间中,是否有重复的数。

    Input

    第一行,两个整数n和m,表示序列中元素的个数以及需要检测的次数。

    第二行n个元素,表示序列中的元素。

    接下来m行,每行两个整数L和R(L≤R),表示需要检测的区间。 

    Output
    对于每个询问,如果这个区间没有重复的数字,输出1,否则输0。

    Sample Input

    5 2

    1 2 3 4 1

    1 4

    1 5

    Sample Output

    1

    0

    Hint

    对于30%的数据,n和m的范围[1,500];

    对于50%的数据,n和m的范围[1,5000];

    对于80%的数据,n和m的范围[1,50000],序列中的元素范围[0,105];

    对于100%的数据,n和m的范围[1,500000],序列中的元素范围[0,109];

     

    思路:类似于HH的项链,把查询离线化,按右端点值排序。树状数组维护每个位置是否有新出现的数字,最后比较查询区间的大小和当前区间新出现数字的个数。注意要用hash_map或unordered_map,不能用map,否则会TLE。

     1 %:pragma GCC optimize ("Ofast")
     2 #include<hash_map>
     3 #include<cstdio>
     4 #include<cctype>
     5 #include<cstring>
     6 #include<utility>
     7 #include<algorithm>
     8 #define r first
     9 #define l second.first
    10 #define id second.second
    11 const int N=500001;
    12 inline int getint() {
    13     register char ch;
    14     while(!isdigit(ch=getchar()));
    15     register int x=ch^'0';
    16     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    17     return x;
    18 }
    19 typedef std::pair<int,std::pair<int,int> > Q;
    20 int n;
    21 class FenwickTree {
    22     private:
    23         int val[N];
    24         int lowbit(const int x) {
    25             return x&-x;
    26         }
    27     public:
    28         FenwickTree() {
    29             memset(val,0,sizeof val);
    30         }
    31         void modify(int p,const int x) {
    32             while(p<=n) {
    33                 val[p]+=x;
    34                 p+=lowbit(p);
    35             }
    36         }
    37         int query(int p) {
    38             register int ans=0;
    39             while(p) {
    40                 ans+=val[p];
    41                 p-=lowbit(p);
    42             }
    43             return ans;
    44         }
    45 };
    46 FenwickTree tree;
    47 int main() {
    48     n=getint();
    49     int m=getint();
    50     int a[n+1];
    51     for(register int i=1; i<=n; i++) {
    52         a[i]=getint();
    53     }
    54     Q q[m];
    55     for(register int i=0; i<m; i++) {
    56         q[i].l=getint(),q[i].r=getint();
    57         q[i].id=i;
    58     }
    59     std::sort(&q[0],&q[m]);
    60     int p=1;
    61     __gnu_cxx::hash_map<int,int> last;
    62     bool ans[m];
    63     for(register int i=0; i<m; i++) {
    64         while(p<=q[i].r) {
    65             if(last[a[p]]) tree.modify(last[a[p]],-1);
    66             tree.modify(last[a[p]]=p,1);
    67             p++;
    68         }
    69         ans[q[i].id]=((q[i].r-q[i].l+1)==(tree.query(q[i].r)-tree.query(q[i].l-1)));
    70     }
    71     for(register int i=0; i<m; i++) printf("%d
    ",ans[i]?1:0);
    72     return 0;
    73 }
  • 相关阅读:
    操作系统学习五部曲
    由实模式进入保护模式
    extends && implements
    <mvc:annotation-driven>
    集合类关系
    Servlet8
    SprigMVC基础测试
    (转载)synchronized代码块
    jetty与tomcat
    输入输出流总结
  • 原文地址:https://www.cnblogs.com/skylee03/p/7125267.html
Copyright © 2011-2022 走看看