题目链接

【BZOJ传送门】
【洛谷传送门】

题目大意

单点修改,区间查询有多少种数字。

解法1--树套树

可以直接暴力树套树,我比较懒,不想写。
稍微口胡一下,可以直接来一个树状数组套主席树,也就是待修的主席树。
然后查询的时候,两个根节点减一下就可以了。

解法2--带修莫队

这是带修莫队的模板题。
最简单的莫队是是一个二元组\((l,r)\),这里引入了一个新的参数,变成了三元组\((l,r,t)\),\(t\)所表示的是在这个查询最前面的哪一个修改的编号。
然后我们这个\(t\)当做第三关键字,进行询问的排序。

bool cmp(const Que_rec &A, const Que_rec &B) { return A.l / block == B.l / block ? (A.r / block == B.r / block ? A.t < B.t : A.r < B.r) : A.l < B.l; }

也就是把\(r\)也进行块的排序。
那么在查询的最后,我们需要加上修改操作。
因为如果一个东西修改过后,但是我们先查询了,那么就把这个东西变回去,然后再修改就好了。

代码

开了\(O(2)\)才过掉的垃圾代码。

#include <bits/stdc++.h>
#pragma GCC optimize
#define N 50105
#define M 1000005
using namespace std;
template <typename T> void read(T &x) {
    x = 0; T fl = 1; char ch = 0;
    for (; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') fl = -1;
    for (; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
    x *= fl;
}
struct Que_rec { int l, r, t, id; } q[N];
struct Moy_rec { int id, val; } mo[N];
int block, n, m, q_cnt = 0, m_cnt = 0, res;
int a[N], ddd[M], ans[N];
bool cmp(const Que_rec &A, const Que_rec &B) { return A.l / block == B.l / block ? (A.r / block == B.r / block ? A.t < B.t : A.r < B.r) : A.l < B.l; }
void upda(int x) { if (ddd[x] ++ == 0) res ++; }
void updd(int x) { if (-- ddd[x] == 0) res --; }
void modify(int lmo, int id) {
    if (mo[lmo].id >= q[id].l && mo[lmo].id <= q[id].r) updd(a[mo[lmo].id]), upda(mo[lmo].val);
    swap(a[mo[lmo].id], mo[lmo].val);
}
int main() {
    read(n); read(m); block = (int)sqrt(1.0 * n + 0.5) * 2;
    for (int i = 1; i <= n; i ++) read(a[i]);
    for (int i = 1; i <= m; i ++) {
        char opt[5]; scanf("%s", opt); int x, y;
        if (opt[0] == 'Q') { read(x); read(y); ++ q_cnt; q[q_cnt] = (Que_rec){x, y, m_cnt, q_cnt}; }
        else { m_cnt ++; read(x); read(y); mo[m_cnt] = (Moy_rec){x, y}; }
    }
    sort(q + 1, q + 1 + q_cnt, cmp);
    int l = 2, r = 1, lmo = 0; res = 0;
    for (int i = 1; i <= q_cnt; i ++) {
        while (r < q[i].r) upda(a[++ r]);
        while (r > q[i].r) updd(a[r --]);
        while (l > q[i].l) upda(a[-- l]);
        while (l < q[i].l) updd(a[l ++]);
        while (lmo < q[i].t) modify(++ lmo, i);
        while (lmo > q[i].t) modify(lmo --, i);
        ans[q[i].id] = res;
    }
    for (int i = 1; i <= q_cnt; i ++) printf("%d\n", ans[i]);
    return 0;
}

「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】的更多相关文章

  1. bzoj2120: 数颜色 带修莫队

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

  2. bzoj2120 数颜色——带修莫队

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 带修改的莫队: 用结构体存下修改和询问,排好序保证时间后就全局移动修改即可: 参考了T ...

  3. 【bzoj2120】数颜色 带修莫队

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

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

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

  5. BZOJ2120数颜色(带修改莫队)

    莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...

  6. [国家集训队][bzoj2120] 数颜色 [带修改莫队]

    题面: 传送门 思路: 这道题和SDOI2009的HH的项链很像,只是多了一个修改 模板套上去呀 莫队学习请戳这里:莫队 Code: #include<iostream> #include ...

  7. 【BZOJ2120】数颜色(带修莫队)

    点此看题面 大致题意:告诉你\(n\)只蜡笔的颜色,有两种操作:第一种操作将第\(x\)只蜡笔颜色改成\(y\),第二种操作询问区间\([l,r]\)内有多少种颜色的蜡笔. 考虑普通莫队 这题目第一眼 ...

  8. BZOJ2120 数颜色 莫队 带修莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...

  9. BZOJ2120 数颜色 【带修莫队】

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

随机推荐

  1. Vector源码分析

    Vector与ArrayList底层实现基本类似,底层都是用数组实现的,最大的不同是Vector是线程安全的.ArrayList源码分析请参考ArrayList源码分析 一.源码分析 基于jdk1.7 ...

  2. CSS小东西

    1.表格列自动均分 table-layout:fixed; 2.单元格内容自动换行 word-wrap:break-word;

  3. php常用方法

    在日常开发中,经常我们使用系统方法或者是自己封装的方法进行项目的开发.再此总结一下!!! 一.对于字符串截取 1.使用mbstring扩展  (注意编码的设置) mb_substr($str,2,5, ...

  4. JS刷新当前页面的几种方法总结

    reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页 ...

  5. 【转帖】介绍 .NET Standard

    [译]介绍 .NET Standard https://zhuanlan.zhihu.com/p/24267356 跟开发争执过 自己不会写代码 的确不好. 若有任何对翻译的建议,烦请指正 有任何问题 ...

  6. Oracle 检查约束check

    --检查约束 create table test1( id ) primary key, email ) check (email like '%@%') ) drop table test1 ,'1 ...

  7. vue嵌套路由

    父组件  (注:to="/Flow/moban_a"这里不是文件加路径,是父组件路由+子组件路由) 路由配置

  8. hive JDBC客户端启动

    JDBC客户端操作步骤

  9. 安装VC++2015运行库时出现0x80240037错误

    很多时候,当我们将开发好的软件部署到用户的机器上时总会出现各种意想不到的错误,最近在一台原版Windows7系统的电脑上安装VC++运行库的时候,莫名的出现安装失败,然后错误代码为:0x8024003 ...

  10. Lodop中特殊符号¥打印设计和预览不同

    Lodop中¥符号样式改变问题 Lodop中对超文本样式的解析,虽然说是按照调用的本机ie引擎,但是调用的ie版本可能不同,导致在ie下是一种样式,预览又是另一种样式.可能是有些样式没有具体设置,走的 ...