题目链接


题目大意

维护一个集合的mex,每次有三种操作:

  1. '+' x:将数 x 插入集合中
  2. '-' x:将数 x 移除集合
  3. '?' k:询问满足mex的数是k的倍数 既集合中未出现的数中最小的数可以整除k

题目思路:

其实如果只维护操作1,3是比较容易的,只需要每次记录数是否在集合中,并且在每次查询的时候记录下本次数k的答案(每次倍增的查询即可),以便下次查询的时候不必重复查询。

而现在因为有了 操作,所以导致了原先的答案有可能会被他影响。所以我们可以将这种影响记录下来用于查询经过操作后的答案。

所以我们维护一个map<int,vector> change

change[x] 表示的是当x受到减操作后,会影响到的数

\(~~\)例如:当我们查询k = 2时,会经过2,4,6,8,10...,那就说明2的改变会影响这些数的值的改变:

ans[x] 2 4 6 8 10 ...
change[last[x]] 2 2 2 2,4 2 ...

当last[x]受到改变时,例如当我们删除了4时,我们便可以直接遍历change[4],说明2的答案在这个减操作后会被影响,此时查询2时的答案便是4(如果只删除了4)

此外我们还需要维护一个set,表示数的答案区间内的mex,通俗点讲就是k的倍数中哪些数当前不在集合内,哪些数在集合内

map<int,set> del

当我们删除这个数时便insert,否则erase,我们维护的是数x的mex

结合change以后,我们每次进行 '+' || '-' 操作时,维护一下del

每次查询时如果存在del.size()>0,说明答案就是*del[x].begin()

否则倍增查询答案


代码实现

# include<iostream>
# include<bits/stdc++.h>
using namespace std;
# define int long long
# define endl "\n"
const int N = 5e5 + 10;
void solve() {
int n;
cin >> n;
map<int, int> ans;
map<int, bool> vis;
map<int,vector<int> > change;
map<int,set<int>> del; while(n--){
char op;
int x;
cin>>op>>x;
if(op == '+'){
vis[x] = 1;
for(auto y:change[x]){
del[y].erase(x);
}
}
else if(op == '-'){
vis[x] = 0;
for(auto y:change[x]){
del[y].insert(x);
}
}
else{
if(!ans[x]) ans[x] = x;
if(del[x].size()){
cout<<*del[x].begin()<<endl;
}
else{
while(vis[ans[x]]){
change[ans[x]].push_back(x);
ans[x] += x;
}
cout<<ans[x]<<endl;
}
}
}
}
int tt;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
tt = 1; // cin >> tt;
while (tt--)solve(); return 0;
}

Codeforces Round #830 (Div. 2)D2. Balance (Hard version)(数据结构)的更多相关文章

  1. Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)(单调栈,递推)

    Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version) 题意: 你是一名建筑工程师,现给出 n 幢建筑的预计建设高度,你想建成峰状, ...

  2. Codeforces Round #350 (Div. 2) D2. Magic Powder - 2

    题目链接: http://codeforces.com/contest/670/problem/D2 题解: 二分答案. #include<iostream> #include<cs ...

  3. Codeforces Round #527 (Div. 3) D2. Great Vova Wall (Version 2) 【思维】

    传送门:http://codeforces.com/contest/1092/problem/D2 D2. Great Vova Wall (Version 2) time limit per tes ...

  4. Codeforces Round #350 (Div. 2) D2 二分

    五一期间和然然打的团队赛..那时候用然然的号打一场掉一场...七出四..D1是个数据规模较小的题 写了一个暴力过了 面对数据如此大的D2无可奈何 现在回来看 一下子就知道解法了 二分就可以 二分能做多 ...

  5. Codeforces Round #594 (Div. 1) D2. The World Is Just a Programming Task (Hard Version) 括号序列 思维

    D2. The World Is Just a Programming Task (Hard Version) This is a harder version of the problem. In ...

  6. Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 水题

    D2. RGB Substring (hard version) inputstandard input outputstandard output The only difference betwe ...

  7. Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 【递推】

    一.题目 D2. RGB Substring (hard version) 二.分析 思路一开始就想的对的,但是,用memset给数组初始化为0超时了!超时了! 然后我按照题解改了个vector初始化 ...

  8. Codeforces Round #574 (Div. 2) D2. Submarine in the Rybinsk Sea (hard edition) 【计算贡献】

    一.题目 D2. Submarine in the Rybinsk Sea (hard edition) 二.分析 相比于简单版本,它的复杂地方在于对于不同长度,可能对每个点的贡献可能是有差异的. 但 ...

  9. Codeforces Round #738 (Div. 2) D2题解

    D2. Mocha and Diana (Hard Version) 至于D1,由于范围是1000,我们直接枚举所有的边,看看能不能加上去就行,复杂度是\(O(n^2logn)\).至于\(n\)到了 ...

随机推荐

  1. 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...

  2. 跟羽夏学 Ghidra ——窗口

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  3. Spring Boot 整合Hibernate Validator

    Spring Boot 整合Hibernate Validator 依赖 <dependencies> <dependency> <groupId>org.spri ...

  4. uniapp scroll-view组件隐藏滚动条

    在pages.json增加如下配置 "globalStyle": { "navigationBarTextStyle": "black", ...

  5. 【疑难杂症】奇异值分解(SVD)原理与在降维中的应用

    前言 在项目实战的特征工程中遇到了采用SVD进行降维,具体SVD是什么,怎么用,原理是什么都没有细说,因此特开一篇,记录下SVD的学习笔记 参考:刘建平老师博客 https://www.cnblogs ...

  6. 使用MinIO中暂未解决的问题

    时间显示问题 web页面上创建桶的时间跟使用SDK获取的时间不一样,相差8个小时,但是mc命令行客户端获取的时间跟web上的一样

  7. k8s-ingress配置websocket支持

    具体来说,使用的ingress-controller不一样,有关的设置也不太一样 Kubernetes Ingress Controller (k8s官方) 参考 http://github.com/ ...

  8. Centos7主机安装Cockpit管理其他主机

    前提条件:需要管理的每台服务器上都需要安装cockpit 假设Centos7主机安装Cockpit的为A,其他主机为B 如果B上有A的公钥,那么直接连接至B,否则,输入B的用户名密码连接. 问题:在A ...

  9. PostgreSQL 创建表格

    PostgreSQL 使用 CREATE TABLE 语句来创建数据库表格. 语法 CREATE TABLE 语法格式如下: CREATE TABLE table_name( column1 data ...

  10. MongoDB 副本集故障情况描述

    副本集有两种类型三种角色 两种类型: 主节点( Primary)类型:数据操作的主要连接点,可读写. 次要(辅助.从)节点( Secondaries)类型:数据冗余备份节点,可以读或选举. 三种角色: ...