Description

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

Input

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

Output

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

Sample Input

6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6

Sample Output

4
4
3
4

HINT

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

【分析】

好吧,正解应该是树套树,但是...分块可以做....

我的方法很暴力...改了暴力重建..居然还可以过。。

 /*
宋代
辛弃疾
青玉案·元夕
东风夜放花千树。更吹落、星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。
蛾儿雪柳黄金缕。笑语盈盈暗香去。众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <utility>
#include <iomanip>
#include <string>
#include <cmath>
#include <queue>
#include <assert.h>
#include <map>
#include <ctime>
#include <cstdlib>
#include <stack>
#include <set>
#define LOCAL
const int INF = ;
const int MAXN = + ;
const int maxnode = * + * ;
const int MAXM= + ;
using namespace std;
int tot;
int n, q, block_size;
int data[MAXN];
int belong[MAXN], block[MAXN];
int t[MAXN],last[MAXM]; //寻找第x块内有多少个比v要小的
int find(int x, int v){
int l = (x - ) * block_size + , r = min(x * block_size, n);
int first = l;
while (l <= r){
int mid = (l + r) >> ;
if (block[mid] < v) l = mid + ;
else r = mid - ;
}
return l - first;
}
int query(int l, int r){
int ans = ;
if (belong[l] == belong[r]){
for (int i = l; i <= r; i++) if (t[i] < l) ans++;
}else {
for (int i = l; i <= block_size * belong[l]; i++) if (t[i] < l) ans++;
for (int i = block_size * (belong[r] - ) + ; i <= r; i++) if (t[i] < l) ans++;
}
for (int i = belong[l] + ; i < belong[r]; i++) ans += find(i, l);
return ans;
}
//处理块
void build(int x){
int l = (x - ) * block_size + , r = min(x * block_size, n);
for (int i = l; i <= r; i++) block[i] = t[i];
sort(block + l, block + r + );//对一个块的上一次出现的颜色进行排序
}
//将x的颜色改变为v
void change(int x, int v){
for (int i = ; i <= n; i++) last[data[i]] = ;//暴力重构
data[x] = v;
for (int i = ; i <= n; i++){
int tmp = t[i];
t[i] = last[data[i]];
if (tmp != t[i]) build(belong[i]);
last[data[i]] = i;
}
} void init(){
scanf("%d%d", &n, &q);
for (int i = ; i <= n; i++) scanf("%d", &data[i]);
block_size = (int)(sqrt(n * 1.0));
//tot记录总共块的个数
tot = n / block_size;
if (n % block_size) tot++; for (int i = ; i <= n; i++){
//链表式插入
t[i] = last[data[i]];
last[data[i]] = i;
belong[i] = (i - ) / block_size + ;
}
for (int i = ; i <= tot; i++){ build(i);
}
}
void work(){
for (int i = ; i <= q; i++){
char str[];
scanf("%s", str);
if (str[] == 'Q'){
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", query(l, r));
}else{
int l, x;
scanf("%d%d", &l, &x);
change(l, x);
}
}
} int main(){ init();
work();
return ;
}

【BZOJ2120】【块状链表】数颜色的更多相关文章

  1. [BZOJ2120][BZOJ2453]数颜色

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

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

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

  3. bzoj2120 数颜色 莫队 带修改

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

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

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

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

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

  6. BZOJ2120 数颜色 【带修改莫队】

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 6579  Solved: 2625 [Submit][Status][Discus ...

  7. BZOJ2120 数颜色 —— 待修改莫队

    题目链接:https://vjudge.net/problem/HYSBZ-2120 2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit:  ...

  8. BZOJ2120 数颜色(树套树)

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

  9. [Bzoj2120]数颜色 (非正解 )(莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6286  Solved: 2489[Submit][Status][Discuss] ...

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

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

随机推荐

  1. Linux Shell编程(26)——代码块重定向

    像 while, until, 和 for 循环代码块, 甚至 if/then 测试结构的代码块都能做到标准输入的重定向. 即使函数也可以使用这种重定向的格式 .所有的这些依靠代码块结尾的 < ...

  2. 【转】windows常用消息大全(系统消息、通告消息、用户消息)

    原文网址:http://blog.csdn.net/nupt123456789/article/details/7370562 附录A Windows 常用消息大全 表A-1  Windows消息分布 ...

  3. poj 1564 Sum It Up【dfs+去重】

    Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6682   Accepted: 3475 Descrip ...

  4. valuestack(值栈) 和 actioncontext(上下文)

    Strut2的Action类通过属性可以获得所有相关的值,如请求参数属性值等.要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性.在Struts2调用Action类的Ac ...

  5. disconf实践(一)

    公司目前的应用基本采用分布式部署,通过F5进行集群管理.分布式应用带来的好处是,随着流量的增加,可以快速扩展应用节点,分摊压力.分布式也会带来一定的挑战,譬如配置文件管理.如果某个配置要修改,那么所有 ...

  6. 什么是staging server

    原文链接:http://blog.csdn.net/blade2001/article/details/7194895 软件应用开发的经典模型有这样几个环境:开发环境(development).集成环 ...

  7. 浅谈qmake之pro、pri、prf、prl文件

    浅谈qmake之pro.pri.prf.prl文件 转载自:http://blog.csdn.net/dbzhang800/article/details/6348432 尽管每次和cmake对比起来 ...

  8. C#中的线程(中)-线程同步

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  9. AlertDialog.Builder setCancelable用法

    AlertDialog.Builder的setCancelable public AlertDialog.Builder setCancelable (boolean cancelable) Sinc ...

  10. MyBatis Tutorial – CRUD Operations and Mapping Relationships – Part 1---- reference

    http://www.javacodegeeks.com/2012/11/mybatis-tutorial-crud-operations-and-mapping-relationships-part ...