[莫队] 国家集训队 数颜色(尚未完成)

题目描述

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

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

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

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

输入输出格式

输入格式:

第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。

第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。

第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

输出格式:

对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

输入输出样例

输入样例#1:

6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6

输出样例#1:

4
4
3
4

说明

对于100%的数据,N≤50000,M≤50000,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。

本题可能轻微卡常数

题解

  • 带修改莫队裸题
    ```cpp

    include

    include

    include

    include

    include

    include

    include

    define in(i) (i=read())

    using namespace std;
    typedef long long lol;
    lol read()
    {
    lol ans=0,f=1;
    char i=getchar();
    while(i<‘0‘||i>‘9‘)
    {
    if(i==‘-‘) f=-1;
    i=getchar();
    }
    while(i>=‘0‘&&i<=‘9‘)
    {
    ans=(ans<<3)+(ans<<1)+i-‘0‘;
    i=getchar();
    }
    return ans*f;
    }
    struct query
    {
    lol l,r,id,pos,pre;
    }e[200010];
    struct chang
    {
    lol pos,val;
    }q[200010];
    lol c[500010];
    lol cnt[1000010];
    lol ans[200010];
    lol tot,qnum,cnum;
    lol n,m;
    lol cmp(query a,query b)
    {
    if(a.pos!=b.pos) return a.pos<b.pos;
    if(a.r!=b.r) return a.r<b.r;
    return a.pre<b.pre;
    }
    void add(lol x)
    {
    cnt[c[x]]++;
    if(cnt[c[x]]==1) tot++;
    }
    void remove(lol x)
    {
    cnt[c[x]]--;
    if(cnt[c[x]]==0) tot--;
    }
    void work(int now,int i)
    {
    if(q[now].pos>=e[i].l && q[now].pos<=e[i].r)
    {
    if(--cnt[c[q[now].pos]]==0) tot--;
    if(++cnt[q[now].val]==1) tot++;
    }
    swap(q[now].val,c[q[now].pos]);
    }
    void solve()
    {
    for(lol i=1,curl=1,curr=0,now=0;i<=qnum;i++)
    {
    lol l=e[i].l,r=e[i].r;
    while(curll) add(--curl);
    while(currr) remove(curr--);
    while(nowe[i].pre) work(now--,i);
    ans[e[i].id]=tot;
    }
    for(lol i=1;i<=qnum;i++)
    {
    printf("%lld\n",ans[i]);
    }
    }
    int main()
    {
    in(n);in(m);
    lol block=(lol)sqrt(n);
    for(lol i=1;i<=n;i++) in(c[i]);
    for(lol i=1;i<=m;i++)
    {
    char ch;
    cin>>ch;
    if(ch==‘Q‘)
    {
    in(e[++qnum].l);in(e[qnum].r);
    e[qnum].id=qnum;
    e[qnum].pos=(e[qnum].l-1)/block+1;
    e[qnum].pre=cnum;
    }
    else
    {
    in(q[++cnum].pos);in(q[cnum].val);
    }
    }
    sort(e+1,e+1+qnum,cmp);
    solve();
    return 0;
    }

```

原文地址:https://www.cnblogs.com/real-l/p/9210936.html

时间: 2024-10-03 14:38:46

[莫队] 国家集训队 数颜色(尚未完成)的相关文章

莫队学习总结 &amp;&amp; P1903 [国家集训队]数颜色 / 维护队列

关于时间复杂度 对于多维莫队的复杂度差不多为\(O(n^{\frac{2k-1}{k}})\) 摘自zhihu大佬 奇偶分类优化 return a.l == b.l ? (a.l & 1) ? a.r<b.r: a.r>b.r : a.l < b.l; 这样能快是因为指针移到右边后不用再跳回左边,而跳回左边后处理下一个块又要跳回右边,这样能减少一半操作,理论上能快一倍 思路 好久的题目了,之前其实只会点不修改莫队 对带修改的不大会,也就做过这一个题目 今天重新做了一边,算是有了新

国家集训队——数颜色

墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 题解: 做这道题之前不会带修改莫队,山神学会了之后手(嘴)把手(嘴)教我打代码. 莫队算法先放下,带修改莫队是酱的:记下所有的修改,同时为每个询问加入一个时间标记,表示这个询问发生时修改到了哪一步.求解之前记录一个时间戳.每次求解一个询问时,先按普通莫队求解

【[国家集训队]数颜色】

下面的同学们搞怪了 好的,话不多说,我来讲这道题时顺便就来讲讲带修莫队 不知道普通莫队是什么的请参见我之前为小Z的袜子写的博客 首先来审审题意:多个区间询问,询问[l,r]中颜色的种类数.可以单点修改颜色. 莫队可以修改??? 那么我们切入正题 这类问题被称为带修莫队(可持久化莫队). 类比到主席树,即可持久化线段树,可以引入一个"修改时间",表示当前询问是发生在前time个修改操作后的.也就是说,在进行莫队算法时,看看当前的询问和时间指针(第三个指针,别忘了s,e)是否相符,然后进行

[带修莫队] 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行,每行分别代表墨墨会做的一件事情,格

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

毒瘤数据卡普通莫队!! 这道题跟普通的莫队题目差不多,但是多了一个修改操作. 所以带修莫队就横空出世了. 普通莫队记录左端点和右端点,那么这里就再记录一个时间轴,表示当时已经执行过几次修改. 之后莫队模板就有六个while,前四个是一样的. 最后两个判断当前修改次数和目标修改次数的关系.这个就是灵魂了. 重点看这个时间轴上的修改吧. void change(int idx, int i) { if(q[i].l <= c[idx].p && c[idx].p <= q[i].r

【带修莫队】bzoj2120 数颜色

块大小为n1/3. 把询问和修改分开. 每次两个询问之间的修改进行暴力转移,如果修改在上一次询问的区间里,就会对当前状态形成影响. 好慢. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define N 10001 int num[N],n,m,b[N],a[N],enq,enc,anss[N]; struct ASK{

【国家集训队】 数颜色 - 莫队

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

[国家集训队][bzoj2120] 数颜色 [带修改莫队]

题面: 传送门 思路: 这道题和SDOI2009的HH的项链很像,只是多了一个修改 模板套上去呀 莫队学习请戳这里:莫队 Code: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 inline int read(){ 8 int re=0,fla

BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )

莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) ------------------------------------------------------------------------------ #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 50009; int N,