题解 | #用户喜好#
用户喜好
https://www.nowcoder.com/practice/d25162386a3140cbbe6dc071e1eb6ed6
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
public class Main {
private static int[] likes;
private static HashMap<Integer, List<Integer>> likeMap;
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
// solution1(in);
solution2(in);
}
}
/**
* 模拟法: 二分优化
* @param in
*/
private static void solution1(Scanner in){
int n = in.nextInt();
likes = new int[n+1];
likeMap = new HashMap<>();
int like;
List<Integer> list;
for(int i=1; i<=n; i++){
like = in.nextInt();
list = likeMap.get(like);
if(list != null){
list.add(i);
likeMap.put(like, list);
}else{
likeMap.put(like, new ArrayList<>(Collections.singletonList(i)));
}
}
int queries = in.nextInt();
int left, right, k;
for(int i=1; i<=queries; i++){
left = in.nextInt();
right = in.nextInt();
k = in.nextInt();
System.out.println(query(left, right, k));
}
}
private static int query(int left, int right, int k){
int count = 0;
List<Integer> list = likeMap.get(k);
if(list == null){
return 0;
}
// 寻找第一个大于等于left的索引
else{
int l = 0;
int r = list.size()-1;
while(l <= r){
int mid = (l+r)>>1;
if(list.get(mid) > left) {
r = mid-1;
}else if((list.get(mid) < left)){
l = mid+1;
}else{
l = mid;
break;
}
}
for(int i=l; i<list.size(); i++){
if(list.get(i) <= right){
count++;
}
}
return count;
}
}
/**
* 模拟法: 暴力法
* @param in
*/
private static void solution2(Scanner in){
int n = in.nextInt();
likes = new int[n+1];
for(int i=1; i<=n; i++){
likes[i] = in.nextInt();
}
int queries = in.nextInt();
int left, right, k;
for(int i=1; i<=queries; i++){
left = in.nextInt();
right = in.nextInt();
k = in.nextInt();
System.out.println(find(left, right, k));
}
}
private static int find(int left, int right, int k){
int count = 0;
for(int i=left; i<=right; i++){
if(likes[i] == k){
count++;
}
}
return count;
}
}

