首页 > 其他分享 >[luoguP1903] 数颜色

[luoguP1903] 数颜色

时间:2024-11-25 21:36:53浏览次数:8  
标签:颜色 luoguP1903 int -- ++ buc include block

题意

原题链接
给定序列 \(a\),每次查询一个区间 \([l,r]\) 中有多少个不同的数,或进行单点修改。

sol

如果不修改的话,本题就是普通莫队 [luoguSP3267] D-query
由于有修改,所以需要再增加一维,记录这次查询是在多少次修改以后查询的,然后在莫队代码后面添加对修改次数的处理,即暴力修改和还原操作。
排序时,按照先左端点块,再右端点块,最后修改次数的顺序排序,后两项可以进行奇偶性优化。每一块的大小为 \(\lfloor n^{\frac{2}{3}}\rfloor\),均摊时间复杂度为 \(O(n^{\frac{5}{3}})\)。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define x first 
#define y second 

using namespace std;
typedef pair<int, int> PII;

const int N = 150005, M = 1000005;

int n, m;
int c[N];
int buc[M], ans[N], block[N], res = 0;
PII modify[N];

struct Ask{
    int l, r, t, id;

    bool operator< (const Ask &W) const {
        if (block[l] != block[W.l]) return block[l] < block[W.l];
        if (block[r] != block[W.r]) return block[r] < block[W.r];
        return t < W.t;
    }
} queries[N];

void add(int x){
    if (!buc[x]) res ++ ;
    buc[x] ++ ;
}

void del(int x){
    buc[x] -- ;
    if (!buc[x]) res -- ;
}

int main(){
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &c[i]);

    int qcnt = 0, mcnt = 0;
    for (int i = 1; i <= m; i ++ ){
        char op[2];
        int x, y;
        scanf("%s%d%d", op, &x, &y);
        if (*op == 'Q') qcnt ++ , queries[qcnt] = {x, y, mcnt, qcnt};
        else modify[ ++ mcnt] = {x, y};
    }

    int Sz = pow(n, 0.667);
    int bcnt = ceil(1.0 * n / Sz);

    for (int i = 1; i <= bcnt; i ++ )
        for (int j = (i - 1) * Sz + 1; j <= min(n, i * Sz); j ++ )
            block[j] = i;

    sort(queries + 1, queries + qcnt + 1);

    int l = 1, r = 0, time = 0;
    for (int i = 1; i <= qcnt; i ++ ){
        int ql = queries[i].l, qr = queries[i].r, qt = queries[i].t;
        while (l > ql) add(c[ -- l]);
        while (r < qr) add(c[ ++ r]);
        while (l < ql) del(c[l ++ ]);
        while (r > qr) del(c[r -- ]);
        while (time < qt) {
            time ++ ;
            if (ql <= modify[time].x && modify[time].x <= qr) {
                add(modify[time].y);
                del(c[modify[time].x]);
            }
            swap(modify[time].y, c[modify[time].x]);
        }
        while (time > qt) {
            if (ql <= modify[time].x && modify[time].x <= qr) {
                add(modify[time].y);
                del(c[modify[time].x]);
            }
            swap(modify[time].y, c[modify[time].x]);
            time -- ;
        }

        ans[queries[i].id] = res;
    }

    for (int i = 1; i <= qcnt; i ++ ) printf("%d\n", ans[i]);

    return 0;
}

蒟蒻犯的若至错误

  • 忘排序了 awa

标签:颜色,luoguP1903,int,--,++,buc,include,block
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/luoguP1903

相关文章

  • 如何更改placeholder的字体颜色和大小?
    要更改placeholder的字体颜色和大小,您可以使用CSS伪元素::placeholder。以下是如何操作的:方法一:直接在CSS中设置样式这是最常见和推荐的方法。您可以在样式表或<style>标签内添加以下CSS代码:input::placeholder{color:gray;/*设置颜色*/font-size:14px;......
  • 怎么改变选中文本的文字颜色和背景色?
    在前端开发中,改变选中文本的颜色和背景色可以使用CSS的::selection伪元素。::selection{color:/*你想要的文字颜色*/;background-color:/*你想要的背景颜色*/;}使用方法:内联样式:直接在HTML元素的style属性中添加:<pstyle="::selection{color:white;ba......
  • linux使用者须知!Ls命令输出的颜色究竟由什么含义?教你轻松区分~(带私活源码)
     在linux中我们经常会用到Ls命令,我们发现Ls的输出中有各种各样的颜色,今天和大家共同了解一下Ls背后的故事。简介Linux ls(英文全拼:listdirectorycontents)命令用于显示指定工作目录下之内容(列出目前工作目录所含的文件及子目录)。我们可以看到ls的输出中有着不同的颜色......
  • Leetcode 1857. 有向图中最大颜色值
    1.题目基本信息1.1.题目描述给你一个有向图,它含有n个节点和m条边。节点编号从0到n–1。给你一个字符串colors,其中colors[i]是小写英文字母,表示图中第i个节点的颜色(下标从0开始)。同时给你一个二维数组edges,其中edges[j]=[a_j,b_j]表示从节点a_j......
  • 基于CNN的雨雾天气下车辆检测和颜色识别系统
    –引言:开篇简述图像处理在智能交通监控、自动驾驶等领域的关键作用,并强调随着深度学习尤其是卷积神经网络(CNN)的发展,在复杂环境下的车辆颜色精确识别、图像恢复(如去雾和去雨)等难题得以有效解决。yolo改进像去雨去雾技术对目标检测的改进精度具有显著作用,原因如下:提高图......
  • Web前端开发入门学习笔记之CSS 39-40 --新手超级友好版- 文本颜色字体篇
       Foreword写在前面的话: 大家好,我是一名刚开始学习HTML的新手。这篇文章是我在学习html过程中的一些笔记和心得,希望能和同样在学习HTML的朋友们分享。由于我的知识有限,文章中可能存在错误或不准确的地方,欢迎大家在评论区提出建议和指正。我非常期待大家的反馈,以便我能......
  • C#联合Visionpro编程学习记录(将指定颜色的十字线图形添加到CogRecordDisplay上)
    1///<summary>2///将指定颜色的十字线图形添加到CogRecordDisplay上3///</summary>4///<paramname="icogimage"></param>5///<returns></returns>6publicstaticstringAddCrossCurveRecord2CogRecordDisplay(I......
  • Typora 改变代码块颜色
    改变代码块的颜色    改成这样的样式    首先打开文件->偏好设置->外观->主题->打开主题文件夹    并在该文件下创建创建base.user.css文件,引入下面的代码内容,即可..CodeMirror-line.cm-number{color:#7f6bff}/*数字,蓝色*/.CodeM......
  • 帝国cms标题设置了加粗、颜色等属性在内容页显示
    要在EmpireCMS的内容页上显示带有颜色样式的标题,可以通过自定义函数来实现。具体步骤如下:在 e/class/userfun.php 文件中增加自定义函数 DoTitleFont。在内容页模板中替换 [!--title--] 为 <?=DoTitleFont($navinfor[titlefont],$navinfor[title])?>。步骤1:在 e/cl......
  • HTML 颜色
    颜色在网页设计和数字艺术中扮演着至关重要的角色。正如您所提到的,颜色可以通过红色、绿色和蓝色的混合(RGB)来定义,这种混合方式允许我们创建出数百万种不同的颜色。每种颜色的强度(或称为亮度)可以从0(最暗,表示为#00)到255(最亮,表示为#FF)变化。在HTML和CSS中,颜色可以通过十六进制颜色代......