带修莫队模版

Posted king-of-dark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带修莫队模版相关的知识,希望对你有一定的参考价值。

https://www.luogu.com.cn/problem/P1903#submit

#include <iostream>

#include <cstring>

#include <cstdio>

#include <algorithm>

#include <cmath>

#include <cstdlib>

#include <vector>

#include <queue>

#include <map>

#define lson rt<<1

#define rson rt<<1|1

using namespace std;

typedef pair<int, int> P;

typedef pair<int, P> PP;//R L time count

typedef long long ll;

const int maxn=2e5+10;

int a[maxn],num[maxn*10],kuai,time_,q,l,r,time_now,ans_now;

struct nod{

    int L,R,ti,coun;

};

vector<nod> D;

vector<P> ans;

PP t[maxn];

bool cmp(nod n1,nod n2)

{

    if(n1.L/kuai==n2.L/kuai)

    {

        if(n1.R/kuai==n2.R/kuai)

        {

            return n1.ti<n2.ti;

        }

        else

            return n1.R/kuai<n2.R/kuai;

    }

    else

        return n1.L/kuai<n2.L/kuai;

}

inline void l_l()

{

    l--;

    if(num[a[l]]==0)

        ans_now++;

    num[a[l]]++;

}

inline void l_r()

{

    num[a[l]]--;

    if(num[a[l]]==0)

        ans_now--;

    l++;

}

inline void r_l()

{

    num[a[r]]--;

    if(num[a[r]]==0)

        ans_now--;

    r--;

}

inline void r_r()

{

    r++;

    if(num[a[r]]==0)

        ans_now++;

    num[a[r]]++;

}

inline void t_l()

{

    

    int loc=t[time_now].first,ago=t[time_now].second.second;

    if(l<=loc&&loc<=r)

    {

        num[a[loc]]--;

        if(num[a[loc]]==0)

            ans_now--;

        a[loc]=ago;

        if(num[ago]==0)

            ans_now++;

        num[ago]++;

    }

    a[loc]=ago;

    time_now--;

}

inline void t_r()

{

    time_now++;

    int loc=t[time_now].first,co=t[time_now].second.first;

    if(l<=loc&&loc<=r)

    {

        num[a[loc]]--;

        if(num[a[loc]]==0)

            ans_now--;

        a[loc]=co;

        if(num[co]==0)

            ans_now++;

        num[co]++;

    }

    a[loc]=co;

}

 

int main()

{

//    freopen("/Users/mashuo/Downloads/P1903_1.in", "r", stdin);

    

    int n,m;

    cin>>n>>m;

    for(int i=0;i<n;i++)

        cin>>a[i+1];

    int flag=0;

    for(int i=0;i<m;i++)

    {

        char c;

        int l,r;

        cin>>c>>l>>r;

        if(c==‘R‘)

        {

            time_++;

            t[time_]=make_pair(l, make_pair(r, a[l]));

            a[l]=r;

        }else

        {

            nod t1;

            t1.L=l;

            t1.R=r;

            t1.ti=time_;

            t1.coun=flag++;

            D.push_back(t1);

        }

    }

    for(int i=time_;i>0;i--)

        a[t[i].first]=t[i].second.second;

    kuai=exp((log(n)+log(time_))/3);

    sort(D.begin(), D.end(), cmp);

    l=1;r=1;time_now=0;ans_now=1;num[a[1]]=1;

    for(int i=0;i<D.size();i++)

    {

        while(l<D[i].L)l_r();

        while(l>D[i].L)l_l();

        while(r<D[i].R)r_r();

        while(r>D[i].R)r_l();

        while(time_now>D[i].ti) t_l();

        

        while(time_now<D[i].ti) t_r();

        ans.push_back(make_pair(D[i].coun, ans_now));

        

    }

    sort(ans.begin(), ans.end());

    for(int i=0;i<ans.size();i++){

        cout<<ans[i].second<<endl;

    }

}

 

以上是关于带修莫队模版的主要内容,如果未能解决你的问题,请参考以下文章

带修莫队

莫队 + 带修莫队

2120: 数颜色(带修莫队)

Machine Learning(带修莫队)

带修莫队板子

[算法模版]莫队