[BZOJ2120]数颜色

试题描述

墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?

输入

第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

输出

对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

输入示例


Q
Q
R
Q
Q

输出示例


数据规模及约定

对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。

题解

对于每一个位置 i 我们维护 pre[i] 表示上一个最近的同色的位置。然后用主席树维护 pre[i];需要支持修改,所以得用树状数组套主席树。

对于修改相当于链表的插入和删除,我们对于每一种颜色用一个 set 维护位置集合,修改时需要查前驱后继。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <set>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 10010
#define maxcol 1000010
#define maxnode 7840010 int ToT, sumv[maxnode], lc[maxnode], rc[maxnode];
void update(int& y, int x, int l, int r, int p, int v) {
sumv[y = ++ToT] = sumv[x] + v;
if(l == r) return ;
int mid = l + r >> 1; lc[y] = lc[x]; rc[y] = rc[x];
if(p <= mid) update(lc[y], lc[x], l, mid, p, v);
else update(rc[y], rc[x], mid + 1, r, p, v);
return ;
}
int query(int o, int l, int r, int qr) {
if(r <= qr) return sumv[o];
int mid = l + r >> 1, ans = query(lc[o], l, mid, qr);
if(qr > mid) ans += query(rc[o], mid + 1, r, qr);
return ans;
} int rt[maxn], Rt[maxn];
int n, A[maxn], pre[maxn], lst[maxcol];
void change(int p, int val) {
for(int x = p; x <= n; x += x & -x)
update(Rt[x], Rt[x], 0, n, pre[p], -1),
update(Rt[x], Rt[x], 0, n, val, 1);
pre[p] = val;
return ;
}
int Art[maxn], cntA, Drt[maxn], cntD;
void getrt(int A[], int& cnt, int x) {
cnt = 0;
for(; x; x -= x & -x) A[++cnt] = Rt[x];
return ;
}
int ask(int ql, int qr) {
getrt(Art, cntA, qr); Art[++cntA] = rt[qr];
getrt(Drt, cntD, ql - 1); Drt[++cntD] = rt[ql-1];
int sum = 0;
for(int i = 1; i <= cntA; i++) sum += query(Art[i], 0, n, ql - 1);
for(int i = 1; i <= cntD; i++) sum -= query(Drt[i], 0, n, ql - 1);
return sum;
} set <int> colpos[maxcol]; int main() {
n = read(); int q = read();
for(int i = 0; i < maxcol; i++) colpos[i].insert(0);
for(int i = 1; i <= n; i++) {
A[i] = read();
pre[i] = lst[A[i]];
lst[A[i]] = i;
colpos[A[i]].insert(i);
} for(int i = 1; i <= n; i++) update(rt[i], rt[i-1], 0, n, pre[i], 1);
char cmd[5];
while(q--) {
scanf("%s", cmd);
if(cmd[0] == 'Q') {
int l = read(), r = read();
printf("%d\n", ask(l, r));
}
if(cmd[0] == 'R') {
int p = read(), col = read();
if(A[p] == col) continue; // it -> next ttit -> now tit -> pre
set <int> :: iterator it = colpos[A[p]].lower_bound(p), tit = it, ttit;
it++; tit--;
if(it != colpos[A[p]].end()) change(*it, *tit);
colpos[A[p]].erase(p); colpos[col].insert(p);
it = colpos[col].lower_bound(p); ttit = tit = it;
it++; tit--;
if(it != colpos[col].end()) change(*it, *ttit);
change(*ttit, *tit); A[p] = col;
}
} return 0;
}

[BZOJ2120][BZOJ2453]数颜色的更多相关文章

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

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

  2. 【BZOJ2453】维护队列/【BZOJ2120】数颜色 分块

    [BZOJ2453]维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色 ...

  3. 【bzoj2453】维护队列/【bzoj2120】数颜色 分块+二分

    题目描述 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好, ...

  4. 【bzoj2120】 数颜色

    http://www.lydsy.com/JudgeOnline/problem.php?id=2120 (题目链接) 题意 给出一个n个数,m个询问,每次询问一个区间或修改一个数,求区间内不同的数有 ...

  5. BZOJ2120:数颜色——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2120 https://www.luogu.org/problemnew/show/P1903#su ...

  6. BZOJ2120:数颜色

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...

  7. BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)

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

  8. BZOJ2120&2453数颜色——线段树套平衡树(treap)+set/带修改莫队

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

  9. 【BZOJ2120】数颜色

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

随机推荐

  1. RAID基础

    磁盘类型 类型 IDE Integrated Drive Electronics SATA Srial ATA SCSI Small Computer System Interface FC Fibe ...

  2. spark序列化及MapOutputTracker解析

    本文主要打算对spark内部的序列化机制以及在shuffle map中起衔接作用的MapOutputTracker做一下剖析.主要涉及具体实现原理以及宏观设计的一些思路. 1,spark序列化 任何一 ...

  3. [转]自定义ASP.NET MVC JsonResult序列化结果

    本文转自:http://blog.163.com/luckcq@yeah/blog/static/17174770720121293437119/ 最近项目中前台页面使用EasyUI的jQuery插件 ...

  4. P2192 HXY玩卡片

    题目描述 HXY得到了一些卡片,这些卡片上标有数字0或5.现在她可以选择其中一些卡片排成一列,使得排出的一列数字组成的数最大,且满足被90整除这个条件.同时这个数不能含有前导0,即0不能作为这串数的首 ...

  5. 【学习笔记】比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围

    1.在表示网络传输速度中与表示存储单位的不同: 表示存储单位时:1kB=1024B,但在网络中表示传输速度是1KB=1000B 2.下面介绍表示存储单位时的关系及其与操作系统位数的关系: 1B=8bi ...

  6. iOS圆形图片裁剪,原型图片外面加一个圆环

    /** *  在圆形外面加一个圆环 */ - (void)yuanHuan{ //0.加载图片 UIImage *image = [UIImage imageNamed:@"AppIcon1 ...

  7. IOS之GCD记录

    在 GCD 中,加入了两个非常重要的概念: 任务 和 队列. 任务:即操作,你想要干什么,说白了就是一段代码,在 GCD 中就是一个 Block,所以添加任务十分方便.任务有两种执行方式: 同步执行 ...

  8. windows系统下查看或删除自己电脑的共享文件以及文件夹

    (1)查看所有共享 net share (2)删除指定共享 例如:删除C盘共享 net share C$ /delete     net share 共享名 /delete (/del)

  9. 洛谷 P1434 滑雪

    题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...

  10. centos7环境搭建Eureka-Server注册中心集群

    目的:测试和线上使用这套独立的Eureka-Server注册中心集群,目前3台虚拟机集群,后续可直接修改配置文件进行新增或减少集群机器. 系统环境: Centos7x64 java8+(JDK1.8+ ...