Count distinct in range queries (offline)
Java
Hard
6 views
Problem Description
Task: answer queries (l,r) for number of distinct values. Use Mo's algorithm outline.
Output Format
Return value
Constraints
Return answers in query order.
Official Solution
static int[] distinctQueries(int[] a,int[][] q){int n=a.length;int m=q.length;int[] ord=new int[m];for(int i=0;i<m;i++) ord[i]=i;int blk=(int)Math.sqrt(n)+1;java.util.Arrays.sort(ord,(i,j)->{int bi=q[i][0]/blk,bj=q[j][0]/blk; if(bi!=bj) return bi-bj; return (bi%2==0)?(q[i][1]-q[j][1]):(q[j][1]-q[i][1]);});java.util.HashMap<Integer,Integer> freq=new java.util.HashMap<>();int[] ans=new int[m];int L=0,R=-1,distinct=0;for(int id:ord){int l=q[id][0],r=q[id][1];while(R<r){int v=a[++R];int c=freq.getOrDefault(v,0)+1;freq.put(v,c);if(c==1) distinct++;}while(R>r){int v=a[R--];int c=freq.get(v)-1; if(c==0){freq.remove(v);distinct--;}else freq.put(v,c);}while(L<l){int v=a[L++];int c=freq.get(v)-1; if(c==0){freq.remove(v);distinct--;}else freq.put(v,c);}while(L>l){int v=a[--L];int c=freq.getOrDefault(v,0)+1;freq.put(v,c);if(c==1) distinct++;}ans[id]=distinct;}return ans;}
Solutions (0)
No solutions submitted yet. Be the first!
No comments yet. Start the discussion!