首页 > 编程语言 >莫队算法

莫队算法

时间:2024-02-04 22:36:59浏览次数:18  
标签:50005 int add pos 算法 del 区间 莫队

简要介绍:
莫队算法是先进行分块,然后按照分块来排序,然后对已知区间进行增减以达到所求区间,记录下答案,最后按照所询问的顺序进行输出答案。
如对于已知区间[l,r]要求[l-1,r],[l-2,r],[l-3,r],[l-4,r],则将已知区间向左移,同时进行add添加操作;
而对于要求[l,r+1],[l,r+2],[l,r+3],[l,r+4]则将已知区间向右移,同时进行add添加操作。
对于新区间,若已知区间范围比新区间小,则要在移动的同时,要把相应的答案加上(add操作),而对于已知区间比新区间大的,则要在移动的同时,将相应的答案减去(del操作)。
主要模板:
莫队算法的区别主要在于add函数和del函数,对于不同的题目,所写的add函数和del函数不一样。其他主要架构基本一致。
主要架构为:

点击查看代码
int a[50005],pos[50005];
int ans=0;
int cnt[50005]={0};
int re[50005]={0};
struct Q
{
    int l,r,id;
}q[50005];
bool cmp(Q &a,Q &b)
{
    return pos[a.l]==pos[b.l]?a.r<b.r:pos[a.l]<pos[b.l];
}
 void solve()
 {
     int n,m,k;
     cin>>n>>m>>k;
     int siz=sqrt(n);
     for(int i=1;i<=n;i++)
     {
        cin>>a[i];
        pos[i]=i/siz;
     }
     for(int i=0;i<m;i++)
     {
        cin>>q[i].l>>q[i].r;
        q[i].id=i;
     }
     sort(q,q+m,cmp);

        int l=1,r=0;
     for(int i=0;i<m;i++)
     {
        while(q[i].l<l)--l,add(l);
        while(q[i].r>r)++r,add(r);
        while(q[i].l>l)del(l),l++;
        while(q[i].r<r)del(r),r--;
        re[q[i].id]=ans;

     }
     for(int i=0;i<m;i++)
     cout<<re[i]<<'\n';

 }

洛谷P2709 小B的询问

点击查看代码
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define ll long long
int a[50005],pos[50005];
int ans=0;
int cnt[50005]={0};
int re[50005]={0};
struct Q
{
    int l,r,id;


}q[50005];
bool cmp(Q &a,Q &b)
{
    return pos[a.l]==pos[b.l]?a.r<b.r:pos[a.l]<pos[b.l];
}
void add(int x)
{
    cnt[a[x]]++;
    ans+=(cnt[a[x]])*(cnt[a[x]])-(cnt[a[x]]-1)*(cnt[a[x]]-1);


}
void del(int x)
{
    cnt[a[x]]--;
    ans-=(cnt[a[x]]+1)*(cnt[a[x]]+1)-cnt[a[x]]*cnt[a[x]];


}
 void solve()
 {
     int n,m,k;
     cin>>n>>m>>k;
     int siz=sqrt(n);
     for(int i=1;i<=n;i++)
     {
        cin>>a[i];
        pos[i]=i/siz;
     }
     for(int i=0;i<m;i++)
     {
        cin>>q[i].l>>q[i].r;
        q[i].id=i;
     }
     sort(q,q+m,cmp);

        int l=1,r=0;
     for(int i=0;i<m;i++)
     {
        while(q[i].l<l)--l,add(l);
        while(q[i].r>r)++r,add(r);
        while(q[i].l>l)del(l),l++;
        while(q[i].r<r)del(r),r--;
        re[q[i].id]=ans;

     }
     for(int i=0;i<m;i++)
     cout<<re[i]<<'\n';

 }
signed main()
{
     cin.tie(NULL);
     cout.tie(nullptr);
     ios_base::sync_with_stdio(false);
     solve();

     return 0;
}

标签:50005,int,add,pos,算法,del,区间,莫队
From: https://www.cnblogs.com/wner/p/18007108

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (193)-- 算法导论14.3 1题
    一、用go语言,写出作用于区间树的结点且在〇(1)时间内更新max属性的过程LEFT-ROTATE的伪代码。文心一言:以下是一个简单的LEFT-ROTATE的伪代码,它对一个二叉搜索树进行左旋转操作。这个操作的作用是更新节点的max属性,使其在O(1)时间内完成。LEFT-ROTATE(T,x)://T是树,x......
  • 2024牛客寒假算法基础集训营1 K 牛镇公务员考试 题解
    Question2024牛客寒假算法基础集训营1K牛镇公务员考试给出一张试卷有\(n\)道单选题,每道题用一个整数\(a_i\)和一个长度为\(5\)的字符串\(s_i\)表示,其中第\(i\)道题的题面为:第\(a_i\)道题的答案是()A.\(s_1\)B.\(s_2\)C.\(s_3\)D.\(s_4\)E.\(s_5\)问:正......
  • 【算法专题】排序详解
    各种排序快速排序、归并排序、桶排序、堆排序1、快速排序(quick_sort)时间复杂度:\(O(nlogn)\)//快速排序模版voidquick_sort(intq[],intl,intr)//数组,左端点,右端点{if(l>=r)return;//“>>”:右移运算符,相当于除以2intx=q[l+r>>1],......
  • 代码随想录算法训练营第一天 | 27. 移除元素 | 704. 二分查找
     704.二分查找 已解答简单 相关标签相关企业 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例1:输入:numstarget输出:解释:nums......
  • 代码随想录算法训练营第十一天 | 20. 有效的括号 | 1047. 删除字符串中的所有相邻重
     有效的括号 已解答简单 相关标签相关企业 提示 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应......
  • 【算法】树分治
    1.算法简介树分治(Treedivision),是处理树上路径类问题的算法。树分治又可以分为点分治与边分治。考虑这样一个问题:给定一棵有\(n\)个点的树,询问树上距离为\(k\)的点对是否存在。暴力的做法就是枚举两个点然后计算距离,统计答案。这样显然\(O(n^2)\)的。我们发现瓶颈在于......
  • 基础算法(十四)离散化+二分 ---以题为例
    假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。输入格式第一行包含两个整数 n 和 m。接下来 ......
  • 很好用的python游戏环境(续):强化学习算法走迷宫游戏环境(导航问题 navigation):分享一个pyt
    前文分享了一个python下的maze游戏环境,本文再给出一个不错的实现项目,这个项目的实现更加的简单,并且可视化界面做的很好看,是用tkinter框架做的可视化:相关:迷宫游戏python实现Github地址:https://github.com/wonanut/Maze-Game/tree/Maze-game-v1.0.7......
  • 很好用的python游戏环境:强化学习算法走迷宫游戏环境(导航问题 navigation):分享一个pyth
    项目的GitHub地址(作者:莫凡):https://github.com/MorvanZhou/mmaze运行的示例代码:importmmazestart=(0,0)end=(10,10)m=mmaze.generate(width=11,height=11,symmetry="horizontal")solutions=m.solve(start=start,end=end)m.plot(solution=solutions[0],star......
  • 国产AI模型和美国顶级AI模型的距离在哪?—— 算力?算法?数据?
    前段时间去了长春一汽,聊了ReinforcementLearning方面的工作,既是面试,也是谈了谈意向,最后全部OK,本打算是签合同了,结果HR说要求有三年的社保缴纳证明工作经验,最后说可以减到24个月,不过说来也是有意思,我这人还真没社保,这就尴尬了,最后说这是上面的文件,国企就这要求,后来也只能作罢,但是......