首页 > 编程语言 >C112 莫队算法 P1494 [国家集训队] 小 Z 的袜子

C112 莫队算法 P1494 [国家集训队] 小 Z 的袜子

时间:2024-04-05 12:11:06浏览次数:19  
标签:cnt P1494 int 莫队 sum include 国家集训队 id

视频链接:

 

 

Luogu P1494 [国家集训队] 小 Z 的袜子

// 普通莫队 O(n*sqrt(n))
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

const int N=50005;
int n,m,B,a[N];
int sum,cnt[N],ans1[N],ans2[N];
struct Q{
  int l,r,id;
  //按l所在块的编号l/B和r排序
  bool operator<(const Q &x) const{
    if(l/B!=x.l/B) return l<x.l;
    if((l/B)&1) return r<x.r;
    return r>x.r;
  }
}q[N];

void add(int x){
  sum+=cnt[x]; //当前x与前面每个x组合成双
  cnt[x]++;    //x的出现次数
}
void del(int x){
  cnt[x]--; 
  sum-=cnt[x];
}
int gcd(int a,int b){
  return b?gcd(b,a%b):a;
}
int main(){
  scanf("%d%d",&n,&m);
  B=sqrt(n); //块的大小
  for(int i=1;i<=n;i++) //颜色
    scanf("%d",&a[i]);
  for(int i=1;i<=m;i++) //询问
    scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
  sort(q+1,q+m+1);
  for(int i=1,l=1,r=0;i<=m;i++){
    if(q[i].l==q[i].r){
      ans1[q[i].id]=0,ans2[q[i].id]=1;
      continue;
    }
    while(l>q[i].l)add(a[--l]);//左扩展
    while(r<q[i].r)add(a[++r]);//右扩展
    while(l<q[i].l)del(a[l++]);//左删除
    while(r>q[i].r)del(a[r--]);//右删除
    ans1[q[i].id]=sum;
    ans2[q[i].id]=1ll*(r-l+1)*(r-l)/2;
  }
  for(int i=1;i<=m;i++){
    if(ans1[i]){
      int g=gcd(ans1[i],ans2[i]);
      ans1[i]/=g,ans2[i]/=g; //最简分数
    }
    else ans2[i]=1;
    printf("%d/%d\n",ans1[i],ans2[i]);
  }
}

 

标签:cnt,P1494,int,莫队,sum,include,国家集训队,id
From: https://www.cnblogs.com/dx123/p/18113583

相关文章

  • 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让光标左右动的无聊游戏。我最开始选中了标红点的部分。多选中了左边的一个点,少选中了右边的一个点。然后我会莫队了?......
  • CF1514D-区间(绝对)众数-莫队、随机化、可持久化线段树
    link:https://codeforces.com/contest/1514/problem/D很久以前小号打的场了,当时D题写的莫队,现在重新来看看。题意:给一个序列\([a_1,\dots,a_n]\),有q次询问,每次问:把\([a_l,\dots,a_r]\)划分最少几个不相交子序列,才能使得每个子序列是beautiful的。称一个序列\(a_1,\dots,a_x\)......
  • 【学习笔记】分块/莫队
    众所周知,分块是一种比较暴力的数据结构。虽说分块效率不高,但它能处理一些树状数组和线段树难以维护的东西(尤其是不具备可拆分性和可合并性的东西)。分块遵循整块维护,块内暴力的原则。所以我们一般先考虑一个暴力算法,再使用分块优化。建立分块:我们定义一个分块的结构体b,分别存......
  • 莫队与分块学习笔记
    分块思想介绍分块是一种思想,而不是一种数据结构。思想就是,将一块大的区间,转换成小的区间来处理。例如,在一个\(n\)长度上的数轴,我们可以将其分成\(\sqrtn\)个长度为\(\sqrtn\)的块来解决。典型问题对于一类很典型的问题,可以用分块来做。单点修改,区间查询这玩意咋......
  • [莫队]
    P2709莫队特点是一种优雅的暴力解决大部分区间离线问题的离线算法主要思想为分块,将\(n^2\)降为\(n\sqrt{n}\)题目关键词包含\(n,m,k\),并有多个询问\(L_i,R_i\),求区间内的...思想相当于有两个指针\(L,R\),若当前询问的区间为\(l[i],r[i]\)那么会分别将\(L,R\)向\(l[i......
  • 分块和莫队
    1分块1.1概念简述分块被称为“优雅的暴力”。对于一个区间$[1,n]$,我们将其分成若干个块。在处理整块时直接维护整块信息,达到降低时间复杂度的目的。对于常规分块,设块长为$m$,则一般情况下$m$取$\sqrt{n}$时复杂度最优。下面举几例来说明分块如何降低时间复杂度。1.2......