数字盒子
问题描述
你有一个盒子,你可以往里面放数,也可以从里面取出数。
初始时,盒子是空的,你会依次做 Q 个操作,操作分为两类:
- 插入操作:询问盒子中是否存在数 x,如果不存在则把数 x 丢到盒子里。
- 删除操作:询问盒子中是否存在数 x,如果存在则取出 x。
对于每个操作,你需要输出是否成功插入或删除。
输入
第一行一个正整数 Q,表示操作个数。
接下来 Q 行依次描述每个操作。每行 2 个用空格隔开的非负整数 op,x 描述一个操作:op 表示操作类型,op=1 则表示这是一个插入操作,op=2 则表示这是一个删除操作;x 的意义与操作类型有关,具体见题目描述。
数据范围
对于 100% 的数据,保证 x<10^18,Q≤5*10^5。
思路
方法一 ,使用set直接进行模拟,复杂度O(nlogn)
方法二,使用散列表,将一个大数取模,转换成一个较小的数储存起来。如果离线的做的话,最好是直接将其离散化,如果要在线的做就比较有意思了,就是上述的思路,比较不妥的是可能会有一些数字出现重复,那么就在原来储存的vectorvp[MAXN]里面把原来的数字压进去,每次O(1)的时间访问到这个vector后再在里面进行遍历,看数字有无出现过。