题目链接


题目大意:

给出nnn个数字,qqq个询问;

每次询问有两种类型,一种是询问区间,一种是单体修改;

询问区间是询问区间内最小的没用到的大于0的整数;

比如我有一串数字是 1 1 2 2 2 3 那么有两个1 三个2,一个3 出现次数分别有 两 三 一, 那么次数最小的没在区间内出现的是4;


解题思路:

对于这道题,除带修改莫队的模板之外,我们多加两个数组 vis cnt

vis数组用来记录某个数出现的频率,cnt用来记录出现过的频率

那么每次询问的答案便是最小的没出现过的频率

我们发现1+2+3+...n=n(n−1)/21+2+3+...n=n(n-1)/21+2+3+...n=n(n−1)/2的那么每次查询可以暴力查询,每次复杂度是O(n)O(\sqrt n)O(n​)的

这里要先把数先离散化用map直接hash会T


AC code

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = N;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}int n, m;
int where[maxn]; // 统计左右端点在哪个块?
int Cnum, Qnum;
// Cnum 修改操作的个数,Qnum 查询操作的个数
int Count[maxn], a[maxn], base, out[maxn];
int color[maxn], tot;
unordered_map<int,int> mp;
int f(int x){if(!mp.count(x)){mp[x] = ++tot;}return mp[x];
}
// base是块的大小,out是用来输出答案的,ans是统计答案用的, color 统计颜色个数
struct Quary {int l, r, pre, id;
}Q[maxn];int comp(const Quary &a,const Quary &b) {return a.l / base == b.l / base ? a.r / base == b.r / base ? a.pre < b.pre : a.r < b.r : a.l < b.l;
}struct Change {int pos, val;
}C[maxn];inline void Add(int val) {Count[color[val]] --;++ color[val];Count[color[val]] ++;
}inline void Delete(int val) {Count[color[val]] --;-- color[val];Count[color[val]] ++;
}inline void work(int now, int i) {if(C[now].pos >= Q[i].l && C[now].pos <= Q[i].r) {Count[color[a[C[now].pos]]] --;-- color[a[C[now].pos]];Count[color[a[C[now].pos]]] ++;Count[color[C[now].val]] --;++ color[C[now].val];Count[color[C[now].val]] ++; }swap(C[now].val,a[C[now].pos]);
}inline int col() {for(int i = 1;1;i ++)if(Count[i] == 0)return i;
}inline void Moqueue() {int l = 1, r = 0, now = 0;for(int i = 1; i <= Qnum; ++ i) {while(l > Q[i].l) Add(a[--l]);while(r < Q[i].r) Add(a[++r]);while(l < Q[i].l) Delete(a[l++]);while(r > Q[i].r) Delete(a[r--]);while(now < Q[i].pre) work(++now,i);while(now > Q[i].pre) work(now--,i);out[Q[i].id] = col();}for(int i = 1; i <= Qnum; ++ i)printf("%d\n",out[i]);
}int main() {read(n,m);base = pow(n,0.666); // n^(2/3)次方for(int i = 1; i <= n; ++ i) {read(a[i]);a[i] = f(a[i]);where[i] = (i - 1) / base + 1;}  while(m --) {int op;read(op);if(op == 1) {++ Qnum;read(Q[Qnum].l,Q[Qnum].r);Q[Qnum].id = Qnum;Q[Qnum].pre = Cnum;} else {++ Cnum;read(C[Cnum].pos,C[Cnum].val);C[Cnum].val = f(C[Cnum].val);}}sort(Q+1,Q+1+Qnum,comp);Moqueue();return 0;
}

带修莫队 ---- 离散化 + 暴力 + 带修莫队 F. Machine Learning相关推荐

  1. Codeforces 940 F - Machine Learning(带修改莫队, 及注意事项)

    F - Machine Learning You come home and fell some unpleasant smell. Where is it coming from? You are ...

  2. CF940F Machine Learning(带修莫队模板)

    CF940F Machine Learning 纯模板题 有几个需要注意的地方 1.维度是all+1维,其中查询一维,修改一维,共二维,所以块的大小 s i z e = n 2 / 3 size=n^ ...

  3. 为什么PrimeTime修timing时,带physical aware还不如不带physical aware

    Physical awre的概念的提出,其实时间也很早了,印象中应该有七八年的时间了. 当时笔者曾试图通过脚本语言来实现这个概念,取得了一些不错的进展.后来synopsys也在工具里增加了这个功能,并 ...

  4. 【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)

    文章目录 问题引入 介绍莫队算法及其实现过程 时间复杂度 莫队算法适用范围 莫队奇偶优化 普通莫队:小B的询问 树上莫队:SP10707 COT2 - Count on a tree II 回滚莫队: ...

  5. 学校计算机专业春联大全带横批,关于学校的春联带横批.doc

    关于学校的春联带横批 关于学校的春联带横批 篇一:有关学校的春联 1. 上联:扬帆起航让海蓝浸润生命 下联:踏浪逐日在彼岸引吭高歌 横批:海阔天空 2. 上联:教诲如涓涓细流点点滴滴终成沧海 下联:引 ...

  6. 1.深度好文:带缓冲I/O 和不带缓冲I/O的区别与联系

    首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用.系统内核对磁盘的读写都会提供一个块缓冲(在有些地方也被称为内核高速缓存),当用write函数对其 ...

  7. 计算机学院教师老带新总结,教师以老带新个人工作总结三篇

    教师以老带新个人工作总结三篇 教师专业发展是教师成长的重要内容和途径,下面是小编收集的教师以老带新个人工作总结,欢迎阅读. 教师以老带新个人工作总结1 20xx年8月来到滨海学院从教,转眼一个学期结束 ...

  8. php 网址尾部带斜杠和不带区别,URL路径中带正斜杠/与不带的区别

    简单理解:不带斜杠的URL结尾通常被服务器识别成独立文件,当它去查找这个文件缺失的时候,就会重定向到带斜杠的URL,这个时候带斜杠的URL,可以理解成为是目录. 解读URL结尾斜杠的产生: 举例: - ...

  9. 【转载】IIS网站配置不带www域名直接跳转带www的域名

    很多时候为了统一网站入口,需要将不带www的主域名解析到带www的域名记录下,当客户访问不带www的域名网址的时候自动跳转到带www的域名,在IIS Web服务器中可以通过URL重写模块来实现此功能, ...

最新文章

  1. linux 由一个文件夹复制到另外一个文件夹
  2. C++关键字积累——持续更新
  3. 【转载】c#多线程使用webbrowser控件
  4. Silverlight学习笔记之文字特效之ImageBrush
  5. Mybatis的xml文件中$ 与 #的区别
  6. 从NBear到ADO.NET Entity Framework让我迷惑了
  7. Win10 Terminal + WSL 2 安装配置指南,精致开发体验
  8. Properties类 解析xml文件问题
  9. pandas选取特定段
  10. 蓝牙耳机连接笔记本声音卡顿解决办法
  11. 2020级训练赛10.23
  12. 智能优化算法:共生生物搜索算法 - 附代码
  13. 【C++】模板特化、偏特化
  14. 8086指令系统中的寻址方式
  15. python解数学方程_用Python如何解数学方程
  16. 基于深度学习的无人驾驶道路检测
  17. **在一个字符串中寻找另外一个字符串**
  18. fffffffffffffffffffffffffffff
  19. (十二)python图形用户界面
  20. Dubbo的RPC调用流程

热门文章

  1. pandas高级处理-交叉表与透视表
  2. python中yield的认识与学习|生成器
  3. 创业基础(第8章 新企业的创办与管理) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
  4. OCR光学字符识别方法汇总(附开源代码)
  5. 在没有深度学习的情况下找到道路
  6. 干货 | MTCNN实时人脸检测网络详解与代码演示
  7. 类选择器和所作用的标签一起写为什么不起作用? - CSDN博客
  8. java.sql.SQLException: java.lang.StackOverflowError
  9. 找不到完美数据科学家?你还可以组建一支数据科学梦之队
  10. mysql图形化及命令行操作用户权限