【模板】 莫队算法

莫队算法??

这个算法是由之前的国家队队长莫涛巨神(Orz….%%%)发明的,所以尊称莫队算法。

莫队是啥??

如果我们知道区间[L,R],就能在O(1)求出[L−1,R],[L+1,R],[L,R−1],[L,R+1]的话,那就可以用莫队算法了。

莫队咋搞??

1):排序,以左段点所在的块为第一关键字,以右端点为第二关键字

2):从左往右处理询问(离线)

3):不断调整l,r的位置并同时修改

莫队代码??

题目:HH的项链 基本是模板题……

#include 
using namespace std;
struct question{
    int l;
    int r;
    int id;
}qst[1110000];           //由于是离线做法,所以要开结构体存一下
int comp(const question & a,const question & b)
{
    if(a.l==b.l)    return a.rreturn a.l//结构体排序
int sum,num[1110000],l=0,r=0,ans[1110000];
void pls(int A)
{
    num[A]++;
    if(num[A]==1)
    {
        sum++;
    }
}                     
void mns(int B)
{
    num[B]--;
    if(num[B]==0)
    {
        sum--;
    }
}
int str[1111000];
int main()
{
    int m,n,k;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&str[i]);

    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&qst[i].l,&qst[i].r);
        qst[i].id=i;
    }
    sort(qst+1,qst+m+1,comp);           //以l为第一关键字,以r为第二关键字 排序

    for(int i=1;i<=m;i++)
    {
        while(rwhile(r>qst[i].r)
            mns(str[r]),r--;

        while(lwhile(l>qst[i].l)
            l--,pls(str[l]);
        //因为r和l的初始值的原因,while循环内部顺序不可改变
        ans[qst[i].id]=sum;
    }
    for(int i=1;i<=m;i++)
        cout<return 0;
}

莫队!!

莫队算法在解决离线区间询问几乎是无敌的。
恩,几乎只要能离线,用分块的莫队算法都能取得一个令人满意的的解法。
所以就有很多扩展(解决线段树等数据结构由于需要区间加和性而不能解决的问题),如区间众数,平均数什么的。
恩。棒!

你可能感兴趣的:(C++编程,模板,黑恶势力)