带修莫队 ---- 离散化 + 暴力 + 带修莫队 F. Machine Learning
题目链接
题目大意:
给出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相关推荐
- Codeforces 940 F - Machine Learning(带修改莫队, 及注意事项)
F - Machine Learning You come home and fell some unpleasant smell. Where is it coming from? You are ...
- CF940F Machine Learning(带修莫队模板)
CF940F Machine Learning 纯模板题 有几个需要注意的地方 1.维度是all+1维,其中查询一维,修改一维,共二维,所以块的大小 s i z e = n 2 / 3 size=n^ ...
- 为什么PrimeTime修timing时,带physical aware还不如不带physical aware
Physical awre的概念的提出,其实时间也很早了,印象中应该有七八年的时间了. 当时笔者曾试图通过脚本语言来实现这个概念,取得了一些不错的进展.后来synopsys也在工具里增加了这个功能,并 ...
- 【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)
文章目录 问题引入 介绍莫队算法及其实现过程 时间复杂度 莫队算法适用范围 莫队奇偶优化 普通莫队:小B的询问 树上莫队:SP10707 COT2 - Count on a tree II 回滚莫队: ...
- 学校计算机专业春联大全带横批,关于学校的春联带横批.doc
关于学校的春联带横批 关于学校的春联带横批 篇一:有关学校的春联 1. 上联:扬帆起航让海蓝浸润生命 下联:踏浪逐日在彼岸引吭高歌 横批:海阔天空 2. 上联:教诲如涓涓细流点点滴滴终成沧海 下联:引 ...
- 1.深度好文:带缓冲I/O 和不带缓冲I/O的区别与联系
首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用.系统内核对磁盘的读写都会提供一个块缓冲(在有些地方也被称为内核高速缓存),当用write函数对其 ...
- 计算机学院教师老带新总结,教师以老带新个人工作总结三篇
教师以老带新个人工作总结三篇 教师专业发展是教师成长的重要内容和途径,下面是小编收集的教师以老带新个人工作总结,欢迎阅读. 教师以老带新个人工作总结1 20xx年8月来到滨海学院从教,转眼一个学期结束 ...
- php 网址尾部带斜杠和不带区别,URL路径中带正斜杠/与不带的区别
简单理解:不带斜杠的URL结尾通常被服务器识别成独立文件,当它去查找这个文件缺失的时候,就会重定向到带斜杠的URL,这个时候带斜杠的URL,可以理解成为是目录. 解读URL结尾斜杠的产生: 举例: - ...
- 【转载】IIS网站配置不带www域名直接跳转带www的域名
很多时候为了统一网站入口,需要将不带www的主域名解析到带www的域名记录下,当客户访问不带www的域名网址的时候自动跳转到带www的域名,在IIS Web服务器中可以通过URL重写模块来实现此功能, ...
最新文章
- linux 由一个文件夹复制到另外一个文件夹
- C++关键字积累——持续更新
- 【转载】c#多线程使用webbrowser控件
- Silverlight学习笔记之文字特效之ImageBrush
- Mybatis的xml文件中$ 与 #的区别
- 从NBear到ADO.NET Entity Framework让我迷惑了
- Win10 Terminal + WSL 2 安装配置指南,精致开发体验
- Properties类 解析xml文件问题
- pandas选取特定段
- 蓝牙耳机连接笔记本声音卡顿解决办法
- 2020级训练赛10.23
- 智能优化算法:共生生物搜索算法 - 附代码
- 【C++】模板特化、偏特化
- 8086指令系统中的寻址方式
- python解数学方程_用Python如何解数学方程
- 基于深度学习的无人驾驶道路检测
- **在一个字符串中寻找另外一个字符串**
- fffffffffffffffffffffffffffff
- (十二)python图形用户界面
- Dubbo的RPC调用流程
热门文章
- pandas高级处理-交叉表与透视表
- python中yield的认识与学习|生成器
- 创业基础(第8章 新企业的创办与管理) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
- OCR光学字符识别方法汇总(附开源代码)
- 在没有深度学习的情况下找到道路
- 干货 | MTCNN实时人脸检测网络详解与代码演示
- 类选择器和所作用的标签一起写为什么不起作用? - CSDN博客
- java.sql.SQLException: java.lang.StackOverflowError
- 找不到完美数据科学家?你还可以组建一支数据科学梦之队
- mysql图形化及命令行操作用户权限