区间检测
区间检测(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\n",ans[i]?1:0); 72 return 0; 73 }