首页 > 其他分享 >C114 回滚莫队 歴史の研究

C114 回滚莫队 歴史の研究

时间:2024-04-08 21:45:25浏览次数:14  
标签:回滚 C114 int LL include 莫队

视频链接:C114 回滚莫队 歴史の研究_哔哩哔哩_bilibili

 

 

 

Luogu AT_joisc2014_c 歴史の研究

// 回滚莫队 O(n^(3/2))
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

#define LL long long
const int N=1000005;
int n,m,B,block[N];
LL a[N],b[N];
LL res,last,ans[N],cnt[N],c[N];
struct Q{
  int l,r,id;
  bool operator<(Q &b){
    if(block[l]!=block[b.l])return l<b.l;
    return r<b.r;
  }
}q[N];

void add(int x){ //加上一个数的贡献
  ++cnt[x];
  res=max(res,cnt[x]*b[x]);
}
LL calc(int l,int r){ //暴力计算块内
  LL mx=0;
  for(int i=l;i<=r;++i)c[a[i]]=0;
  for(int i=l;i<=r;++i){
    ++c[a[i]];
    mx=max(mx,c[a[i]]*b[a[i]]);
  }
  return mx;
}
int main(){
  scanf("%d%d",&n,&m); B=sqrt(n); //块长
  for(int i=1;i<=n;++i)
    scanf("%lld",a+i),b[i]=a[i],
    block[i]=(i-1)/B+1; //i在哪个块
  int num=block[n];     //块数
  sort(b+1,b+n+1);
  for(int i=1;i<=n;++i) //离散化a
    a[i]=lower_bound(b+1,b+n+1,a[i])-b;
  for(int i=1,l,r;i<=m;++i)
    scanf("%d%d",&l,&r),q[i]={l,r,i};
  sort(q+1,q+m+1);
  
  for(int i=1,x=1;i<=num;++i){  //第i块
    res=last=0;
    for(int j=1;j<=n;++j)cnt[j]=0; //清空
    int R=min(B*i,n),l=R+1,r=R;
    for(;block[q[x].l]==i;++x){ //第i块的查询x
      if(block[q[x].l]==block[q[x].r]){ //块内
        ans[q[x].id]=calc(q[x].l,q[x].r);
        continue;
      }
      while(r<q[x].r)add(a[++r]); //右扩展
      last=res;         //结果存为last
      while(l>q[x].l)add(a[--l]); //左扩展
      ans[q[x].id]=res; //结果存入答案
      while(l<=R) --cnt[a[l++]];  //回滚l
      res=last;         //回滚结果
    }
  }
  for(int i=1;i<=m;++i)printf("%lld\n",ans[i]);
}

 

标签:回滚,C114,int,LL,include,莫队
From: https://www.cnblogs.com/dx123/p/18117409

相关文章

  • 分块与莫队
    不沾树的博客变短了好多。分块例题这道题显然可以使用线段树乱搞过去,不过为了给主角面子我们假设我们不会做。对于一些难以使用数据结构维护答案的序列问题,我们考虑暴力。但是暴力太慢了,于是人们提出了分块。分块,就是把序列分成许多的小段,通过一些神秘的处理实现优化暴力。......
  • C113 带修莫队 P1903 [国家集训队] 数颜色/维护队列
    视频链接:   LuoguP1903[国家集训队]数颜色/维护队列//带修莫队O(n^(5/3))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;constintN=1000005;intn,m,B,mq,mr,a[N];intsum,cnt[N],ans[N];st......
  • C112 莫队算法 P1494 [国家集训队] 小 Z 的袜子
    视频链接:  LuoguP1494[国家集训队]小Z的袜子//普通莫队O(n*sqrt(n))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;constintN=50005;intn,m,B,a[N];intsum,cnt[N],ans1[N],ans2[N];str......
  • C111【模板】莫队算法 P2709 小B的询问
    视频链接:C111【模板】莫队算法P2709小B的询问_哔哩哔哩_bilibili   LuoguP2709小B的询问//普通莫队O(n*sqrt(n))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;constintN=50005;intn,m,k,B,a[N];......
  • 莫队算法学习笔记
    Part.1引入当你遇到一个区间询问但是难以用线段树等log算法维护的时候怎么办?那就是——莫队!莫队这个东西能支持区间修改、区间查询的操作,但是这种算法要求离线。莫队有很多种,详细请看下文。Part.2普通莫队我们先来看一道例题(P1972的削弱版):给你一个长度为\(n\)的序列......
  • 初识莫队
    莫队个人理解:这是一种较为暴力的算法,适用于解决维护序列区间操作的问题。主要思想:把所有的操作离线,按某种方式重新排序。操作过程中不断转移当前区间的答案。(\([L,R]\Rightarrow[L\pm1,R\pm1]\))希望转移的复杂度尽量的小(\(O(n\sqrt{m})\))01-普通的莫队(无修改......
  • 莫队
    以为自己一辈子接触不到的算法,本来以为很高深,没想到是优雅的暴力,太绝妙了对于多个区间查询,例如区间最大值等,我们考虑暴力,枚举区间$[L,R]$,取最大值即可,时间复杂度$O(m*(R-L))$,跑不起,所以我们借用数据结构,单调队列,树状数组等等,但是如果此时我们考虑优化暴露首先我......
  • 莫队学习笔记
    模板。然后我不会做。然后我去看题解,看莫队学习笔记,看不懂。然后我摆烂了。然后去玩按住shift让光标左右动的无聊游戏。我最开始选中了标红点的部分。多选中了左边的一个点,少选中了右边的一个点。然后我会莫队了?......
  • 关于并发编程一些问题与解决--事务回滚@Transactional
    先贴一下代码吧@Transactional@OverridepublicintupSunp(Integera_id){//查询数据库QueryWrapper<Animal>animalQueryWrapper=newQueryWrapper<>();animalQueryWrapper.eq("a_id",a_id);Animalanima......
  • 稳定性方法论:可灰度 & 可监控 & 可回滚
    业务系统核心目标是挣钱,系统稳定性建设核心是防止丢钱(丢钱逻辑如下图所示),站在公司的角度看,产品功能建设和系统稳定性是同等重要。  前段时间写了《稳定性治理框架》,该文章在稳定性建设的理论和实践基础上,抽象出稳定性治理的框架,希望建立一个稳定性治理的标准动作、最......