题意:
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:

1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。

2、 R P Col 把第P支画笔替换为颜色Col。

为了满足墨墨的要求,你知道你需要干什么了吗?

思路:
如果没有修改的话,那么就可以用莫队很轻松的做出来(或者是主席树)。
但是带了修改我们该怎么办呢,带修莫队或者(树套树)。

空间 时间
树套树 O(nlogn2)O(nlogn^2)O(nlogn2) O(nlogn2)O(nlogn^2)O(nlogn2)
带修莫队 O(n)O(n)O(n) n5/3n^{5/3}n5/3

具体可以根据题目来选择。
带修莫队块的大小为pow(2/3)时,世家复杂度时最优秀的,具体的证明:戳我
与普通莫队不同的是,加了一维时间轴。

在修改时:
1.若修改的位置在当前区间内,需要更新答案(sub原颜色,add修改后的颜色)。
2.无论修改的位置是否在当前区间内,都要进行修改(以供add和sub函数在以后更新答案)。

代码:

//#pragma GCC optimize(2)
#include<bits/stdc++.h>#define endl '\n'
//#define ll long long
//#define int long long
using namespace std;
const int maxn=2e5+10;int a[maxn];struct node{int l,r,t,id;
}q[maxn];
pair<int,int> c[maxn];
int cntq,cntc;
int be[maxn],sz;struct rule{bool operator ()(const node & x,const node & y)const{if(be[x.l]!=be[y.l])return x.l<y.l;if(be[x.r]!=be[y.r])return x.r<y.r;return x.t<y.t;}
};int cnt[1000010];
int sum,ans[maxn];
int l=0,r=0,t=0;void add(int x){if(++cnt[a[x]]==1) sum++;
}void sub(int x){if(--cnt[a[x]]==0) sum--;
}
void upt(int x){if(c[x].first>=l&&c[x].first<=r){if(--cnt[a[c[x].first]]==0) sum--;if(++cnt[c[x].second]==1) sum++;}swap(c[x].second,a[c[x].first]);
}signed main(){int n,m;cin>>n>>m;sz=pow(n,2.0/3.0);for(int i=1;i<=n;i++){cin>>a[i];be[i]=i/sz+1;}for(int i=1;i<=m;i++){char opt;int x,y;cin>>opt>>x>>y;if(opt=='Q'){q[++cntq].l=x;q[cntq].r=y;q[cntq].id=cntq;q[cntq].t=cntc;}else{c[++cntc].first=x;c[cntc].second=y;}}sort(q+1,q+cntq+1,rule());for(int i=1;i<=cntq;i++){while(r<q[i].r) add(++r);while(l>q[i].l) add(--l);while(r>q[i].r) sub(r--);while(l<q[i].l) sub(l++);while(t<q[i].t) upt(++t);while(t>q[i].t) upt(t--);ans[q[i].id]=sum;}for(int i=1;i<=cntq;i++) cout<<ans[i]<<endl;}

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

  1. 带修莫队 ---- P1903 [国家集训队]数颜色 / 维护队列 带修莫队模板

    题目链接 题目大意: 解题思路: 带修改的莫队 首先我们要知道,普通的莫队算法是不资瓷修改操作的, 不过后人对莫队算法加以改进 发明了资瓷修改的莫队算法 思路 在进行修改操作的时候,修改操作是会对答案 ...

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

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

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

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

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

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

  5. 莫队+带修莫队模板与总结

    以下总结参考了许多大佬们的博客,开篇先(大佬)% 莫队的入门题目主要为莫队和带修莫队在,这里就先在这里总结一下这两类题目的一些属性. 我认为莫队本质是一种比较优化的暴力查找法.在通过分块操作后把复杂度 ...

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

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

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

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

  8. 莫队算法 (普通莫队、带修莫队、树上莫队)

    莫队算法 主要基于分块的思想 用结构体记录询问的左右端点及询问编号 (这是一个离线算法) 通过排序优化指针扫描顺序优化时间复杂度 . 1.普通莫队 例题:SP3267 DQUERY - D-query ...

  9. 莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

    一.理解 我的理解就是巧妙的暴力,利用双指针以及分块思想,巧妙的移动双指针,时间复杂度可以达到O(NlogN). 强推博客:写的又好又全.链接 二.套路 1.普通莫队 [1]核心代码 bool cmp ...

最新文章

  1. php 显示要上传的图片格式,php判断文件上传图片格式的实例详解
  2. 在网页中使用for (flask框架)
  3. hadoop中NameNode、DataNode和Client三者之间协作关系及通信方式介绍
  4. MFC标签页控件的使用
  5. java建立新文件保存数据_关于java中创建文件,并且写入内容
  6. java mm_Java网络编程-你是GG还是MM?
  7. 一个js文件 多个html文件怎么打开,通过PHP在PhantomJs中打开多个html文件抛出语法错误...
  8. ZooKeeper 会话的秘密
  9. 软考论文写作的时间分配
  10. Postman设置环境变量
  11. Windows安装Svn客户端
  12. java list随机取_java list随机抽取元素的案例
  13. matlab dll 通达信,通达信DLL插件实战篇,怎样制作我们想要的函数
  14. 网站服务器攻击的方法,常见的几种WEB服务攻击方式
  15. 【探究服务】——服务的更多技巧
  16. Python学习随笔:PyCharm的错误检测使用及调整配置减少错误数量
  17. python批量图片合并
  18. C++运算符重载 ++,--,+,-,+=,-=,输出输入运算符
  19. Excel去除重复项的几种方法
  20. mysql evict_SpringBoot+Mybatis+MySQL实现读写分离

热门文章

  1. MATLAB知识点总结
  2. 使用OpenCV进行图像编辑--绘画和素描
  3. 基于OpenCV的网络实时视频流传输
  4. python中将HTTP头部中的GMT时间转换成datetime时间格式
  5. 初学Python——文件操作第三篇
  6. 烂泥:ubuntu 14.04搭建Open***服务器
  7. 解决sdk manager 下载API失败的问题
  8. Xen 和 KVM 下如何关闭 virbr0
  9. 字符串(string类)
  10. YSlow使用指南_最新2.0使用指南中文版