模板:莫队算法

本文介绍了一种基于块的区间查询优化方法,通过预处理和排序技术减少查询时的数据访问次数,适用于离线批量处理场景。文章详细展示了如何定义查询结构体、如何进行排序以及更新查询结果的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct Query{  
    int l,r,id,block;  
    Query(){}  
    Query(int L,int R,int ID):l(L),r(R),id(ID){  
        block=l/len;  
    }  
    bool operator <(const Query rhs)const{  
        if(block==rhs.block) return r<rhs.r;  
        else return block<rhs.block;  
    }  
}query[maxn];
//对块排序
 sort(query+1,query+q+1);
//符合条件,区间ans就++
int l=1,r=0,ans=0;  
for(int i=1;i<=q;i++){  
    while(r<query[i].r){  
        r++;  
        if(!num[fa[r]]++) ans++;  
    }  
    while(r>query[i].r){  
        if(!--num[fa[r]]) ans--;  
        r--;  
    }  
    while(l<query[i].l){  
        if(!--num[fa[l]]) ans--;  
        l++;  
    }  
    while(l>query[i].l){  
        l--;  
        if(!num[fa[l]]++) ans++;  
    }  
    an[query[i].id]=ans;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值