java解法,思路比较简单
1、用一个Map来保存每一个下标t和它的值c
2、用ArrayList来存储每一个key
3、用PriorityQueue来保持一个最小的下标
具体操作:
1、添加操作:首先在【t-30,t+30】这个区间判断是否存在key值,如果存在就不添加,不存在就添加
2、获取操作:如果不存在为t的下标key,那么就输出0,否则将Map中key为t的值取出
3、删除操作:首先判断PriorityQueue是否为空,如果为空,那么久输出“skipped”,否则就从中弹出一个最小key,然后从Map, ArrayList中一次删除该key
4、不要问我ArrayList有什么用,我写到现在才发现ArrayList没用 0.0! 0.0!
(最初的打算是在添加元素的时候遍历一次ArrayList,判断是否需要添加元素,后来写的时候直接用Map.containKeys了)
import java.util.ArrayList; import java.util.HashMap; import java.util.PriorityQueue; import java.util.Scanner; public class Main { static ArrayList<Integer> keys = new ArrayList<>(); static PriorityQueue<Integer> min = new PriorityQueue<>(); static HashMap<Integer,Integer> hashMap = new HashMap<>(); public static void main(String[] args) { Scanner sc = new Scanner(System.in); int times = sc.nextInt(); sc.nextLine(); while(times -- > 0) { String s = sc.nextLine(); String[] action = s.split("\\s+"); if (action.length == 1) { if (action[0].equals("-1")) { if (!min.isEmpty()) remove(min.peek()); //输出 else System.out.println("skipped"); } else { get(Integer.parseInt(action[0])); //输出 } } if (action.length == 2) { add(Integer.valueOf(action[0]),Integer.valueOf(action[1])); } } } static void add(int t, int c) { boolean isAdd = true; for (int i = t - 30; i <= t + 30; i++) { if (hashMap.containsKey(i)) { //error? isAdd = false; break; } } if (isAdd == true) { hashMap.put(t,c); keys.add(t); min.add(t); } } static void remove(int t) { System.out.println(hashMap.get(t)); hashMap.remove(t); min.poll(); keys.remove(keys.indexOf(t)); } static void get(int t) { if (hashMap.containsKey(t) == false) { System.out.println(0); } else { System.out.println(hashMap.get(t)); } } }