为了不断优化推荐效果,今日头条每天要存储和处理海量数据。假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k。因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1)。
为了不断优化推荐效果,今日头条每天要存储和处理海量数据。假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k。因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1)。
输入: 第1行为n代表用户的个数 第2行为n个整数,第i个代表用户标号为i的用户对某类文章的喜好度 第3行为一个正整数q代表查询的组数 第4行到第(3+q)行,每行包含3个整数l,r,k代表一组查询,即标号为l<=i<=r的用户中对这类文章喜好值为k的用户的个数。 数据范围n <= 300000,q<=300000 k是整型
输出:一共q行,每行一个整数代表喜好值为k的用户的个数
5 1 2 3 3 5 3 1 2 1 2 4 5 3 5 3
1 0 2
样例解释: 有5个用户,喜好值为分别为1、2、3、3、5, 第一组询问对于标号[1,2]的用户喜好值为1的用户的个数是1 第二组询问对于标号[2,4]的用户喜好值为5的用户的个数是0 第三组询问对于标号[3,5]的用户喜好值为3的用户的个数是2
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = in.nextInt(); } int q = in.nextInt(); int[][] query = new int[q][3]; for (int i = 0; i < q; i++) { query[i][0] = in.nextInt(); query[i][1] = in.nextInt(); query[i][2] = in.nextInt(); } for (int i = 0; i < q; i++) { int result = 0; int start = query[i][0] - 1; int end = query[i][1] - 1; for(int j = start; j <= end; j++){ if(arr[j] == query[i][2]){ result++; } } System.out.println(result); } } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ Map<Integer,Node> map=new HashMap<>(); int n=sc.nextInt(); for(int i=0;i<n;i++){ int val=sc.nextInt(); if(map.containsKey(val)) map.put(val,map.get(val).add(i+1)); else map.put(val,new Node(i+1)); } int q=sc.nextInt(); for(int i=0;i<q;i++){ int l=sc.nextInt(); int r=sc.nextInt(); int k=sc.nextInt(); if(!map.containsKey(k)){ System.out.println(0); }else{ System.out.println(map.get(k).getSize(l,r)); } } } sc.close(); } } class Node{ private TreeSet<Integer> set; public Node(int index){ set=new TreeSet<>(); set.add(index); } public Node add(int index){ set.add(index); return this; } public int getSize(int l,int r){ return set.subSet(l,true,r,true).size(); } }