BZOJ 2120 数颜色&2453 维护队列 [带修改的莫队算法]【学习笔记】

题意:

询问区间中不同颜色的个数,单点修改颜色



发现以前写的学习笔记没法看,于是重写一下(不就是会用latex了嘛)

额外维护一个当前修改操作执行到的时间

如果要进行某个查询操作,修改操作的时间必须移动到这个查询操作处

按照$(pos[l], pos[r], tim)$排序

令$S=N^{\frac{2}{3}}$, 有$N^{\frac{1}{3}}$块

$l$移动$N*N^{\frac{2}{3}}$次

$r$移动$N*N^{\frac{1}{3}}+N*N^{\frac{2}{3}}$次

$cur$移动$N*N^{\frac{1}{3}}*N^{\frac{1}{3}}$次

注意排序一定排对了啊啊啊啊

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1e4+5, M=1e6+5;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}

int n,Q,a[N],pos[N],m,block,t[N],x,y;
char op[3];
struct meow{
    int l,r,tim,id;
    bool operator <(const meow &a) const{
        return pos[l]==pos[a.l] ? ( pos[r]==pos[a.r] ? tim<a.tim : pos[r]<pos[a.r]) : pos[l]<pos[a.l];
    }
}q[N];
struct cmeow{int p,v,last;}cq[N];
int p,tim, ans[N];
int c[M], now;
int l=1,r=0,cur=0;
inline void add(int x) {now+= (++c[x])==1;}
inline void del(int x) {now-= (--c[x])==0;}
inline void cha(int p,int v){
    if(l<=p && p<=r) add(v), del(a[p]);
    a[p]=v;
}
void modui(){
    for(int i=1;i<=p;i++){
        while(cur<q[i].tim) cur++, cha(cq[cur].p, cq[cur].v);
        while(cur>q[i].tim) cha(cq[cur].p, cq[cur].last), cur--;
        while(r<q[i].r) r++, add(a[r]);
        while(r>q[i].r) del(a[r]), r--;
        while(l<q[i].l) del(a[l]), l++;
        while(l>q[i].l) l--, add(a[l]);
        ans[ q[i].id ]=now;
    }
}
int main(){
    //freopen("in","r",stdin);
    n=read(); Q=read();
    block=sqrt(n); m=(n-1)/block+1;
    for(int i=1;i<=n;i++) a[i]=t[i]=read(), pos[i]=(i-1)/block+1;
    for(int i=1;i<=Q;i++){
        scanf("%s",op); x=read(); y=read();
        if(op[0]==‘Q‘) q[++p]=(meow){x, y, tim, p};
        else cq[++tim]=(cmeow){x, y, t[x]}, t[x]=y;
    }
    sort(q+1, q+1+p);
    modui();
    for(int i=1;i<=p;i++) printf("%d\n",ans[i]);
}
时间: 2024-10-12 18:08:10

BZOJ 2120 数颜色&2453 维护队列 [带修改的莫队算法]【学习笔记】的相关文章

带修改的莫队算法学习小记

简介 莫涛大神创造出的离线询问算法的带修改版. 算法基础:需要掌握莫队算法,会打暴搜(暴力). 一个叫莫的双端队列. 只支持单点修改 操作方法 普通的不带修改的莫队算法要把每个询问带上两个关键字排序,现在待修改的莫队算法要带上三个关键字排序. 初始操作 fo(i,1,m) { scanf("%s%d%d",s,&k,&l); if (s[0]=='Q')a[++tot].l=k,a[tot].r=l,a[tot].x=num,a[tot].p=tot; else d[+

bzoj 2120: 数颜色(带修改的莫队算法)

2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 2908  Solved: 1130 [Submit][Status][Discuss] Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需

BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树

https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节不要出现zz错误. 这道题修改的数量比较少可以写莫队,但是如果修改数量多或者是特别极限的数据大概是不行的吧. 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstrin

bzoj 2120: 数颜色 线段树套平衡树

/************************************************************** Problem: 2120 User: wangyucheng Language: C++ Result: Time_Limit_Exceed ****************************************************************/ #include<iostream> #include<cstdio> #incl

[Bzoj2120]数颜色 (非正解 )(莫队)

2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6286  Solved: 2489[Submit][Status][Discuss] Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干

Bzoj 2453: 维护队列 &amp;&amp; Bzoj 2120: 数颜色 分块,bitset

2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 578  Solved: 247[Submit][Status][Discuss] Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好,替换队列中某个弹珠的颜色.但是A还没有学过编程,且觉得头脑风暴太浪费脑力了,所以向你

bzoj 2453 : 维护队列 带修莫队

2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 952  Solved: 432[Submit][Status][Discuss] Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好,替换队列中某个弹珠的颜色.但是A还没有学过编程,且觉得头脑风暴太浪费脑力了,所以向你

[带修莫队] Bzoj 2120 数颜色

Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干什么了吗? Input 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数.第2行N个整数,分别代表初始画笔排中第i支画笔的颜色.第3行到第2+M行,每行分别代表墨墨会做的一件事情,格

bzoj 2120 数颜色

2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 5039  Solved: 2012 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干什么了吗? Input 第1行两个整数N,M,分别