首页 > 其他分享 >C113 带修莫队 P1903 [国家集训队] 数颜色/维护队列

C113 带修莫队 P1903 [国家集训队] 数颜色/维护队列

时间:2024-04-06 13:44:31浏览次数:18  
标签:int C113 P1903 tim include 国家集训队 修莫队

视频链接:

 

 

 

Luogu P1903 [国家集训队] 数颜色/维护队列

// 带修莫队 O(n^(5/3))
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

const int N=1000005;
int n,m,B,mq,mr,a[N];
int sum,cnt[N],ans[N];
struct Q{ //询问
  int l,r,id,tim;
  //按l/B、r/B和tim排序
  bool operator<(Q &b){
    if(l/B!=b.l/B)return l<b.l;
    if(r/B!=b.r/B)return r<b.r;
    return tim<b.tim;
  }
}q[N];
struct R{ //替换
  int p,c;
}R[N];

void add(int x){
  if(!cnt[x])sum++; //x第一次则累计
  cnt[x]++;         //x出现次数
}
void del(int x){
  cnt[x]--;
  if(!cnt[x]) sum--;
}
int main(){
  scanf("%d%d",&n,&m); B=pow(n,0.666);
  for(int i=1;i<=n;i++)scanf("%d",&a[i]);
  for(int i=1;i<=m;i++){ //操作
    char c[2]; int l,r;
    scanf("%s%d%d",c,&l,&r);
    if(c[0]=='Q')q[++mq]={l,r,mq,mr};
    else R[++mr]={l,r};
  }
  sort(q+1,q+1+mq);
  for(int i=1,l=1,r=0,x=0;i<=mq;i++){
    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--]); //右删除
    while(x<q[i].tim){ //时间戳变大,替换
      int p=R[++x].p;
      //位置p介于[l,r],先删旧数,后加新数
      if(l<=p&&p<=r)del(a[p]),add(R[x].c);
      swap(a[p],R[x].c); //交换a,R的对应数
    }
    while(x>q[i].tim){ //时间戳变小,还原
      int p=R[x].p;
      if(l<=p&&p<=r)del(a[p]),add(R[x].c);
      swap(a[p],R[x--].c);
    }
    ans[q[i].id]=sum;
  }
  for(int i=1;i<=mq;i++)printf("%d\n",ans[i]);
}

 

标签:int,C113,P1903,tim,include,国家集训队,修莫队
From: https://www.cnblogs.com/dx123/p/18114158

相关文章

  • 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......
  • P1975 [国家集训队] 排队 题解
    题目链接:排队水紫,\(n\)不大,树套树或者分块都能做。分块的话,最优序列分块套套值域分块最优。观察到是可差性问题维护,即权值数量维护,那我们就树状数组套权值线段树即可。由于\(n\)不大,我们可以不用回收标记,直接数组空间开大点就行。我们预处理出初始逆序对,每一次操作都是基于......
  • P4555 [国家集训队] 最长双回文串
    题目链接:https://www.luogu.com.cn/problem/P4555题解:要找一个由两个回文组成字符串,一定有一个分割的位置,将两个回文串分开,设分割x,x+1,可能成为最后答案的值一定是左边的最长回文串和右边的最长的回文串长度之和。   回文中心一个<x,一个>x+1且一定包含x和x+1。如果最......
  • P2757 [国家集训队] 等差子序列
    题目的等差子序列最少只要求长度为3,那么其实就转化为对于一个数是否存在左右各一个与它差值相等的一对数,比如14325中1,5对3来说就如此。这样的关系放到数轴上就是是否存在一对数到某数的距离相等。由于题目明确是一个排列,也就是1到n所有数一定会出现一次,那么对于某数,它左边的......
  • [国家集训队] 拉拉队排练
    添加分隔符的目的是给偶数长度的回文串一个中心,本题只要求奇数长度的回文串,那么这一步就可以省略了;而且,字符串加法非常慢利用回文串的另一半所携带的信息,注意不能超出回文串的范围边修改边询问,才需要用到高级数据结构;如果所有修改都在询问之前,就不需要了点击查看代码#inclu......
  • P1829 [国家集训队] Crash的数字表格 / JZPTAB
    \[\sum\limits_{i=1}^N\sum\limits_{j=1}^M\frac{ij}{\gcd(i,j)}\]\[\sum\limits_{d=1}^N\frac1d\sum\limits_{i=1}^N\sum\limits_{j=1}^Mij[\gcd(i,j)=d]\]\[\sum\limits_{d=1}^Nd\sum\limits_{i=1}^{\lfloor\fracNd\rfloor}\sum\limits_......
  • [国家集训队] 矩阵乘法 整体二分
    [国家集训队]矩阵乘法题目描述给你一个\(n\timesn\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(k\)小数。输入格式第一行有两个整数,分别表示矩阵大小\(n\)和询问组数\(q\)。第\(2\)到第\((n+1)\)行,每行\(n\)个整数,表示这个矩阵。第\((i+1)\)行......
  • P1527 [国家集训队] 矩阵乘法
    题意给定一个矩阵,每次询问子矩阵的第\(k\)大。Sol考虑把莫队扔到二维上来做。发现复杂度变为:\(O(n^2q^{\frac{3}{4}})\)。卡卡常就过了。Code#include<iostream>#include<algorithm>#include<cstdio>#include<array>#include<cmath>#include<vector>#i......
  • PC1138低功耗低压差线性稳压器低纹波高效率保护性强
    ■产品概述PC1138系列是使用CMOS技术开发的高速、低压差,高精度输出电压,低消耗电流正电压型电压稳压器。由于内置有低通态电阻晶体管,因而压差低,能够获得较大的输出电流。为了使负载电流不超过输出晶体管的电流容量,内置了过载电流保护电路、短路保护电路。■用途移动电话无绳......
  • [国家集训队] 阿狸和桃子的游戏
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e6+10;intn,m;intk[N],a,b,c;intval[N];//如果一条边的两端点被同一个人选了,那么产生边权的贡献//把边权均分到两端点上,每个端点加上c/2//如果这条边被同一个选了,那......