题意简述

给定一个数列,支持两个操作

1.询问l~r有多少不同数字

2.修改某个数字

题解思路

带修莫队

如果修改多了,撤销修改

如果修改少了,进行修改

代码

#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
struct Query
{
int l, r, t, i;
} qu[51000];
struct Modify
{
int p, col;
} mo[51000];
int n, m, cnt1, cnt2, len, s, l = 1, r, t;
int a[51000], c[1001000], ans[51000], tti[51000];
char opt;
bool cmp(const Query &x, const Query &y)
{
if (x.l / len != y.l / len) return x.l / len < y.l / len;
if (x.r / len != y.r / len) return x.r / len < y.r / len;
return x.t < y.t;
}
void add(int x) {s += !(c[x]++); }
void del(int x) {s -= !(--c[x]); }
void replace(int x)
{
int xx = mo[tti[t]].p;
if (xx >= l && xx <= r)
{
s -= !(--c[a[mo[tti[t]].p]]);
s += !(c[mo[tti[t]].col]++);
}
swap(a[mo[tti[t]].p], mo[tti[t]].col);
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
for (register int i = 1; i <= n; ++i) cin >> a[i];
for (register int i = 1; i <= m; ++i)
{
cin >> opt;
if (opt == 'Q')
{
++cnt1;
cin >> qu[cnt1].l >> qu[cnt1].r;
qu[cnt1].t = i;
qu[cnt1].i = cnt1;
}
else
{
++cnt2;
cin >> mo[cnt2].p >> mo[cnt2].col;
tti[i] = cnt2;
}
}
len = n * pow(cnt2, 1.0 / 3);
len = pow(n, 2.0 / 3);
sort(qu + 1, qu + cnt1 + 1, cmp);
for (register int i = 1; i <= cnt1; ++i)
{
while (l > qu[i].l) add(a[--l]);
while (r < qu[i].r) add(a[++r]);
while (l < qu[i].l) del(a[l++]);
while (r > qu[i].r) del(a[r--]);
while (t < qu[i].t) if (tti[++t]) replace(t);
while (t > qu[i].t) if (tti[--t]) replace(t);
ans[qu[i].i] = s;
}
for (register int i = 1; i <= cnt1; ++i) cout << ans[i] << endl;
}

洛谷 P1903 [国家集训队]数颜色的更多相关文章

  1. 洛谷 P1903 [国家集训队]数颜色 解题报告

    P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...

  2. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  3. ●洛谷P1903 [国家集训队]数颜色

    题链: https://www.luogu.org/problemnew/show/P1903题解: 序列带修莫队, 推荐博客https://www.cnblogs.com/Paul-Guderian ...

  4. 洛谷 P1903 [国家集训队]数颜色 / 维护队列

    墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. \(Q\) \(L\) \(R\) 代表询问你从第L支画笔到第R支画笔中共有几种不同 ...

  5. [洛谷P1903][国家集训队]数颜色

    题目大意:有$n$支画笔,有两个操作 $Q\;l\;r:$询问$[l,r]$中有几种颜色 $R\;p\;Col:$把第$p$支画笔的颜色改成$Col$ 题解:带修莫队,分为$n^{\frac{1}{3 ...

  6. 洛谷P1903 [国家集训队]数颜色 / 维护队列 ( 带 修 )

    题意:有两种操作: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 对每个1操作 输出答案: 带修莫队 模板题 (加 ...

  7. 洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队

    题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: \(1\). \(Q\) \(L\) \(R\)代表询问你从第\(L\) ...

  8. bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)

    P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...

  9. P1903 [国家集训队]数颜色 / 维护队列(莫队区间询问+单点修改)

    题目链接:https://www.luogu.org/problemnew/show/P1903 题目大意:中文题目 具体思路:莫队单点修改+区间询问模板题,在原来的区间询问的基础上,我们要记录当前这 ...

随机推荐

  1. SQL Server 表结构操作

    一.创建表 --直接定义主外键 create table wallet( ID ) primary key, ,) not null, Name ) default '余额', Member_ID ) ...

  2. Greenplum高可用真的高吗?

    目录 1. 问题描述 2. 解决方案 @ 1. 问题描述 在项目中使用了Greenplum做分析型数据库,Greenplum自身已经提供了高可用方案,Master节点提供Sdanby备用节点,Segm ...

  3. Redis HyperLogLog用法简介

    (1)HyperLogLog简介 在Redis 在 2.8.9 版本才添加了 HyperLogLog,HyperLogLog算法是用于基数统计的算法,每个 HyperLogLog 键只需要花费 12 ...

  4. [1045] PDOException in Connection.php line 295

    tp5实现登录功能时报错 在使用tp5框架实现登录功能的时候,点击login出现了 [1045] PDOException in Connection.php line 295 这个问题, 报错是 S ...

  5. 基于Actor模型的CQRS、ES解决方案分享

    开场白 大家晚上好,我是郑承良,跟大家分享的话题是<基于Actor模型的CQRS/ES解决方案分享>,最近一段时间我一直是这个话题的学习者.追随者,这个话题目前生产环境落地的资料少一些,分 ...

  6. 小白学python之整型,布尔值,十进制二进制转换和字符串详解for循环!

    整型与字符串转化 十进制转二进制. python2,存在int 整型和long(长整型),在python3里就是int/获取的是浮点数 小数 print(bin(15)) 这样可以通过代码来计算十进制 ...

  7. [小米OJ] 11. 构建短字符串

    思路 排序后对两个字符串遍历 function solution(line) { var str = line.split(" "); var str1 = str[0].spli ...

  8. os模块习题

    os 1.使用python代码统计一个文件夹中所有文件的总大小 import os def func(path): size_sum = 0#文件总大小为0 name_lst = os.listdir ...

  9. 第一次使用cnblog,希望大佬们多多指教

    我目前在学习ML和DeepLearning,在这里和大家共同成长

  10. HashSet源码解读

    一:先看其实现了哪些接口和继承了哪些类 1.实现了Serializable接口,表明它支持序列化. 2.实现了Cloneable接口,表明它支持克隆,可以调用超类的clone()方法进行浅拷贝. 3. ...