题目链接


题目大意:


解题思路:

带修改的莫队

首先我们要知道,普通的莫队算法是不资瓷修改操作的,

不过后人对莫队算法加以改进

发明了资瓷修改的莫队算法

思路

在进行修改操作的时候,修改操作是会对答案产生影响的(废话)

那么我们如何避免修改操作带来的影响呢?

首先我们需要把查询操作和修改操作分别记录下来。

在记录查询操作的时候,需要增加一个变量来记录离本次查询最近的修改的位置

然后套上莫队的板子,与普通莫队不一样的是,你需要用一个变量记录当前已经进行了几次修改

对于查询操作,如果当前改的比本次查询需要改的少,就改过去

反之如果改多了就改回来

说的听绕口的

比如,我们现在已经进行了3次修改,本次查询是在第5次修改之后,那我们就执行第4,5次修改

这样就可以避免修改操作对答案产生的影响了


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 color[maxn], a[maxn], ans, base, out[maxn];
// 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) {if(++ color[val] == 1) ans ++;
}inline void Delete(int val) {if(-- color[val] == 0) ans --;
}inline void work(int now, int i) {if(C[now].pos >= Q[i].l && C[now].pos <= Q[i].r) { //注意这里要判断是否在查询范围内?if(-- color[a[C[now].pos]] == 0) ans --;if(++ color[C[now].val] == 1) ans ++; }swap(C[now].val,a[C[now].pos]);// 你把pos改成了val。下次你再修改就是相当于还原,所以就是把val和a值直接交换就可以了
}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] = ans;}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]);where[i] = (i - 1) / base + 1;} while(m --) {char op[5];scanf("%s",op);if(*op == 'Q') {++ 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);}}sort(Q+1,Q+1+Qnum,comp);Moqueue();return 0;
}

带修莫队 ---- P1903 [国家集训队]数颜色 / 维护队列 带修莫队模板相关推荐

  1. P1903 [国家集训队]数颜色 / 维护队列

    关于时间复杂度 对于多维莫队的复杂度差不多为\(O(n^{\frac{2k-1}{k}})\) 摘自zhihu大佬 奇偶分类优化 return a.l == b.l ? (a.l & 1) ? ...

  2. 洛谷 P1903 [国家集训队]数颜色 / 维护队列

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  3. [国家集训队]数颜色 / 维护队列 (带修莫队模板题)

    题意: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. ...

  4. luoguP1903 [国家集训队]数颜色 / 维护队列

    带修改莫队经典题目 关于莫队的一篇很好的blog 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第 ...

  5. P1903-[国家集训队]数颜色/维护队列【带修莫队】

    正题 题目链接:https://www.luogu.com.cn/problem/P1903 题目大意 要求支持两个操作 QLR:Q\ \ L\ \ R:Q  L  R:询问L,RL,RL,R之间有多 ...

  6. [国家集训队]数颜色

    [国家集训队]数颜色 题解 很水的一道带修莫队板子题. 我们只需要将操作时间看作是当前询问的第三维,排序后跑莫队即可. 三维莫队块长为n23n^{\frac{2}{3}}n32​时时间复杂度是最优的, ...

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 9894  Solved: 4561 [Su ...

  8. BZOJ2038 : [2009国家集训队]小Z的袜子(hose)(莫队算法)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 19269 Solved: 8851 [Sub ...

  9. C语言查看队头元素,C语言实现循环队列的初始化进队出队读取队头元素判空-1...

    目前,处在学习数据结构+ing,由于之前学过了队列,今天就把自己写过的代码做了一些完善分享给大家,希望能够帮助到有需要的朋友,有不足的地方欢迎大家交流    φ(゜▽゜*)♪ 队列是另一种限定性的线性 ...

最新文章

  1. spring in action 4 线路图
  2. VC 系统托盘编程,含有气泡提示
  3. php mongodb连接数据库,PHP下 Mongodb 连接远程数据库的实例代码
  4. 使用区分优先级的负载分流法确保Netflix的可靠性
  5. Java性能优化方面的程序优化知识点归纳,希望对你有所帮助
  6. html之引入独立js方便维护jq代码
  7. 接口成员的特点 java 1614101629
  8. APUE读书笔记-15进程内部通信-05FIFOs
  9. Bootstrap 轮番插件
  10. checkAll全选的一个小例子
  11. Objective-C ---JSON 解析 和 KVC
  12. 2020语言与智能技术竞赛-事件抽取方案整理(第一波
  13. php 卡密支付破解 yj,卡密功能自助授权功能源码
  14. bootstrap EF_Bootstrap优秀模板INSPINIA.2.9.2
  15. 初学者:html中的表单详解(下面附有代码)
  16. 如何将苹果手机中的M4A音乐转换为MP3格式
  17. Excel PivotTable 使用心得手顺分享(六)
  18. 【微信小程序】二维数组列表渲染
  19. 利用Java语言编写一个猜数字游戏(有次数限制)
  20. GDB调试命令以及GDB调试段错误

热门文章

  1. 网络工程师_域名知识点
  2. C语言找最大的int型数!_只愿与一人十指紧扣_新浪博客
  3. 基于OpenCV实战:3步实现图像降噪
  4. 2012年至今,细数深度学习领域这些年取得的经典成果
  5. 43.6% mAP! 阿里巴巴提出:用于一阶段目标检测的半锚式检测器
  6. 第7章——狄克特斯拉算法
  7. 用CSS在博客园底部加上蒲公英动态效果的实现方法
  8. 计算机基础名词概念(一)
  9. 诚信,聪明,快乐,地位与竞争
  10. bootstrap datepicker Uncaught TypeError: Cannot call method 'split' of undefined问题