区间检测

区间检测(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 }
原文地址:https://www.cnblogs.com/skylee03/p/7125267.html