题目链接

带修改莫队: 普通莫队的扩展,依旧从[l,r,t]怎么转移到[l+1,r,t],[l,r+1,t],[l,r,t+1]去考虑

对于当前所在的区间维护一个vis[l~r]=1,在修改值时根据是否在当前区间内修改即可。

块大小取\(O(n^{\frac{2}{3}})\),排序依次按左端点所在块、右端点所在块、修改次数(时间)

复杂度为\(O(n^{\frac{5}{3}})\) (证明在这)

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. #define gc() getchar()
  6. const int N=1e4+5;
  7. int n,m,size,bel[N],A[N],Now,tm[N*100],las[N],Ans[N];
  8. bool vis[N*100];
  9. struct Ask
  10. {
  11. int l,r,id,t;
  12. Ask() {}
  13. Ask(int l,int r,int id,int t): l(l),r(r),id(id),t(t) {} ;
  14. bool operator <(const Ask &a)const
  15. {
  16. if(bel[l]==bel[a.l]) return bel[r]==bel[a.r]?t<a.t:r<a.r;
  17. return l<a.l;
  18. }
  19. }qa[N];
  20. struct Modify
  21. {
  22. int pos,val,bef;
  23. Modify() {}
  24. Modify(int p,int v,int b): pos(p),val(v),bef(b) {} ;
  25. }qm[1005];
  26. inline int read()
  27. {
  28. int now=0;register char c=gc();
  29. for(;!isdigit(c);c=gc());
  30. for(;isdigit(c);now=now*10+c-'0',c=gc());
  31. return now;
  32. }
  33. void Calc(int p)
  34. {
  35. if(vis[p])
  36. if(!--tm[A[p]]) --Now;
  37. else ;
  38. else if(++tm[A[p]]==1) ++Now;
  39. vis[p]^=1;
  40. }
  41. void Change(int p,int v)
  42. {
  43. if(vis[p]) Calc(p), A[p]=v, Calc(p);//(当前位置)在当前访问区间中,先将原先值删掉,再修改、添加
  44. else A[p]=v;//不在访问区间中,直接改掉即可
  45. }
  46. int main()
  47. {
  48. n=read(),m=read(),size=pow(n,0.667);
  49. for(int i=1; i<=n; ++i) bel[i]=(i-1)/size+1, las[i]=A[i]=read();
  50. int na=0,nm=0; char opt[3];
  51. for(int a,b,i=1; i<=m; ++i)
  52. {
  53. scanf("%s",opt),a=read(),b=read();
  54. if(opt[0]=='Q') qa[++na]=Ask(a,b,na,nm);
  55. else qm[++nm]=Modify(a,b,las[a]),las[a]=b;
  56. }
  57. std::sort(qa+1,qa+1+na);
  58. for(int l=1,r=0,t=0,i=1; i<=na; ++i)
  59. {
  60. while(t<qa[i].t) ++t,Change(qm[t].pos,qm[t].val);
  61. while(t>qa[i].t) Change(qm[t].pos,qm[t].bef),--t;
  62. while(l<qa[i].l) Calc(l++);//不能直接代入A[p] vis[]是某位置的标记
  63. while(l>qa[i].l) Calc(--l);
  64. while(r<qa[i].r) Calc(++r);
  65. while(r>qa[i].r) Calc(r--);
  66. Ans[qa[i].id]=Now;
  67. }
  68. for(int i=1; i<=na; ++i) printf("%d\n",Ans[i]);
  69. return 0;
  70. }

BZOJ.2453.维护队列([模板]带修改莫队)的更多相关文章

  1. [bzoj2453]维护队列_带修改莫队

    维护队列 bzoj-2453 题目大意:给定一个n个数序列,支持查询区间数的种类数,单点修改.不强制在线. 注释:$1\le n,m\le 10^5$. 想法: 带修改莫队裸题. 如果没有修改操作的话 ...

  2. bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)

    P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...

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

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

  4. bzoj 2120: 数颜色【带修改莫队】

    比较裸的带修莫队,对每个修改操作记一下它修改的位置修改前的颜色 然后正常莫队,每次对修改操作时间倒流一下即可 #include<iostream> #include<cstdio&g ...

  5. bzoj 3052: [wc2013]糖果公园 带修改莫队

    3052: [wc2013]糖果公园 Time Limit: 250 Sec  Memory Limit: 512 MBSubmit: 506  Solved: 189[Submit][Status] ...

  6. BZOJ 2120 数颜色 【带修改莫队】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 2120: 数颜色 Time Limit: 6 Sec  Memory Limit: ...

  7. BZOJ 2120 数颜色(带修改莫队)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2120 [题目大意] 给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色 ...

  8. BZOJ2120&2453数颜色——线段树套平衡树(treap)+set/带修改莫队

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

  9. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

随机推荐

  1. 【Python】【辅助程序】练手小程序:记录外网动态IP地址

    练手小程序 程序作用:对IP实时记录: 1.定时获取外网IP,存储在本地文件中: 编写思路: 1)收集获取外网的API接口       http://bbs.125.la/thread-1383897 ...

  2. 用C#代码来安装、卸载、启动、关闭服务

    /// <summary>        /// 启动服务         /// </summary>        /// <param name="sen ...

  3. Android 工程中各种文件的介绍

    一:Android.mk     Android.mk 内部定义了一个或者多个源代码的模块,该文件的产生是和NDK相关的,NDK 是Android提供的一种工具,可以为编译mk文件内部的源代码提供依赖 ...

  4. vue系列之获取多选框中被选中的值

    多个勾选框,绑定到同一个数组: <input type="checkbox" id="jack" value="Jack" v-mod ...

  5. jquery实现右键菜单

    <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/h ...

  6. C++ code:函数指针参数

    函数指针除了进行参数传递外,还承接申请的存储空间.释放空间等.而函数指针则主要是用来进行参数传递的,就像引用一样. 例如,我们来看一下函数指针的传递工作.在标准排序算法sort中,对于所提的整数容器v ...

  7. web----Tornado

    安装: pip3 install tornado 源码安装 https://pypi.python.org/packages/source/t/tornado/tornado-4.3.tar.gz 简 ...

  8. P2163 【[SHOI2007]园丁的烦恼】

    其实是不用把一个询问拆成四个的 把询问转化为数学语言: 对于每个查询,询问满足$a<=x<=b$且$c<=y<=d$的点$x,y$的个数 ~~自然~~想到偏序问题,看到有两个式 ...

  9. Fiddler抓包10-会话框添加查看get与post请求类型

    前言 在使用fiddler抓包的时候,查看请求类型get和post每次只有点开该请求,在Inspectors才能查看get和post请求,不太方便.于是可以在会话框直接添加请求方式. 一.添加会话框菜 ...

  10. ERP采购业务(三十七)

    产品构建表的添加存储过程: CREATE PROCEDURE [dbo].[BioPurchaseAppInfo_ADD] @PurchaseID INT OUTPUT, @Subject NVARC ...