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

带修改的莫队

在原有指针$(l,r)$上又添加了时间指针$t$

贴一段dalao的解释

带修改的莫队,和原版莫队相比,多了一个时间轴

原版莫队是将区间(l,r)视为点(l,r),带修改的即加一维时间轴(l,r,t)

对于t轴的移动可以保存每次修改,如果修改在(l,r)间则更新

分块方法可以参照原版莫队,先将l分块,再讲r分块,同一块的按t排序

块大小为可以达到最快的理论复杂度  ,证明如下

设分块大小为a,莫队算法时间复杂度主要为t轴移动,同r块l,r移动,l块间的r移动三部分

t轴移动的复杂度为  ,同r块l,r移动复杂度为  ,l块间的r移动复杂度为 

三个函数max的最小值当a为  取得,为 

给出一个并不严格的假证明

每次查询时:

$t$轴每次最多移动$t$次。而$l,r$指针在块上的组合共$n^{2}/a^{2}$种,故复杂度$O(n^{2}t/a^{2})$

$l$轴每次最多移动$2a$次,最多$n$次。复杂度$O(na)$

$r$轴每次最多移动的次数是一个递减的等差数列:$n,n-a,n-2a.....$,最多共移动$((n+a)(n/a)/2)$次。所以复杂度就是$O(n^{2}/a)$辣

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
void read(int &x){
static char c=getchar();x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
}
#define N 50005
struct data{int x,y,t,id;}a[N];
struct modi{int id,pre,now;}d[N];
int Len,n,m,Q,T,L,R,tot,b[N],c[],ans[N]; inline int bel(int x){return (x-)/Len+;}
bool cmp(data A,data B){
if(bel(A.x)!=bel(B.x)) return bel(A.x)<bel(B.x);
if(bel(A.y)!=bel(B.y)) return bel(A.y)<bel(B.y);
return A.t<B.t;
}
int main(){
char opt[]; int q1,q2;
read(n);read(m); register int i;
for(i=;i<=n;++i) read(b[i]);
for(i=;i<=m;++i){
scanf("%s",opt),read(q1),read(q2);
if(opt[]=='Q') a[++Q]=(data){q1,q2,T,Q};
else d[++T].pre=b[q1],d[T].id=q1,d[T].now=b[q1]=q2;
}
Len=ceil(exp((log(n)+log(T))/));//bzoj酱紫写会RE,直接sqrt(n)就好辣 虽然复杂度没办法保证....
for(i=T;i;--i) b[d[i].id]=d[i].pre;
sort(a+,a+Q+,cmp);
L=R=; T=; c[b[]]=tot=;
for(int i=,Id;i<=Q;++i){
while(L<a[i].x) tot-=(c[b[L]]==),--c[b[L]],++L;
while(L>a[i].x) --L,tot+=(c[b[L]]==),++c[b[L]];
while(R<a[i].y) ++R,tot+=(c[b[R]]==),++c[b[R]];
while(R>a[i].y) tot-=(c[b[R]]==),--c[b[R]],--R;
while(T<a[i].t){
++T; Id=d[T].id;
if(L<=Id&&Id<=R) tot-=(c[b[Id]]==),--c[b[Id]];
b[Id]=d[T].now;
if(L<=Id&&Id<=R) tot+=(c[b[Id]]==),++c[b[Id]];
}
while(T>a[i].t){
Id=d[T].id;
if(L<=Id&&Id<=R) tot-=(c[b[Id]]==),--c[b[Id]];
b[Id]=d[T].pre; --T;
if(L<=Id&&Id<=R) tot+=(c[b[Id]]==),++c[b[Id]];
}
ans[a[i].id]=tot;
}
for(i=;i<=Q;++i) printf("%d\n",ans[i]);
return ;
}

bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)的更多相关文章

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

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

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

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

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

    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...

  4. luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队

    十分玄学的数据结构~ code: #include <bits/stdc++.h> #define N 1000006 #define setIO(s) freopen(s".i ...

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

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

  6. 题解 洛谷P1903/BZOJ2120【[国家集训队]数颜色 / 维护队列】

    对于不会树套树.主席树的本蒟蒻,还是老老实实的用莫队做吧.... 其实这题跟普通莫队差不了多远,无非就是有了一个时间,当我们按正常流程排完序后,按照基本的莫队来,做莫队时每次循环对于这一次操作,我们在 ...

  7. P1903 [国家集训队]数颜色 / 维护队列(莫队区间询问+单点修改)

    题目链接:https://www.luogu.org/problemnew/show/P1903 题目大意:中文题目 具体思路:莫队单点修改+区间询问模板题,在原来的区间询问的基础上,我们要记录当前这 ...

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

    思路 带修莫队的板子 带修莫队只需要多维护一个时间的指针即可,记录一下每个询问在第几次修改之后,再回退或者前进几个修改操作 排序的时候如果a.l和b.l在一个块里,就看r,如果a.r和b.r在一个块里 ...

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

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

随机推荐

  1. Sql Server 主键 外键约束

    主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...

  2. [附POC]Apache Struts2最新(CVE-2017-5638,S02-45)POC

    #! /usr/bin/env python # encoding:utf-8 import urllib2 import sys from poster.encode import multipar ...

  3. cocos2d-x JS 纯代码实现人物头像裁剪

    有时候为了方便会直接用颜色层和过渡层来显示一些信息,但层只有方角没有圆角不太美观,于是我用剪切节点实现了一个圆角层.方便以后使用.   当然,如果使用Cosos Studio 操作会更好一些,省去了坐 ...

  4. time_t time()

    time_t  atime,  btime; time(&atime); btime = time(0); 两种方式效果一样.

  5. css3d旋转

    一.包裹层添加 -webkit-perspective: 800px; -moz-perspective: 800px; 使子元素获得3D效果支持   二.自持子元素需支持3D效果 -webkit-t ...

  6. LeetCode168.Excel表列名称

    给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> ...

  7. CoreWebApi集成Exceptionless

    参考博客 https://www.cnblogs.com/akaxb/p/7207827.html 一. Exceptionlessr的安装部署 依乐祝,<ASP.NET Core免费开源分布式 ...

  8. 转 VS2010 RDLC 横向合并时“未正确设置 tablix“Tablix1”的 FixedData 属性”错误解决方法 .

    最近在使用Rdlc做报表打印,有些报表的表头需要合并表头.Rdlc本身提供了横向合并的工具,但是在实际合并的时候,会出现“未正确设置 tablix“Tablix1”的 FixedData 属性.除非在 ...

  9. Unity 异步加载进度条

    public class View_LoadingScene : MonoBehaviour { //场景加载进度条对象 public GameObject loadingProgressBar; / ...

  10. Redis 的 5 个常见应用场景

    前言Redis 是一个强大的内存型存储,具有丰富的数据结构,使其可以应用于很多方面,包括作为数据库.缓存.消息队列等等. 如果你的印象中Redis只是一个 key-value 存储,那就错过了Redi ...