2120: 数颜色

Time Limit: 6 Sec  Memory Limit: 259 MB

Submit: 6579  Solved: 2625

[Submit][Status][Discuss]

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。

2016.3.2新加数据两组by Nano_Ape

第一次用带修改的莫队

实际就是记录下所有的修改,对于每个询问记录下该询问属于修改了几次时的询问

当到达一个询问时,若当前修改次数不符,就转移修改至当前询问所在修改

为了优化时间,我们按①块②右端点③修改次数   排序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u]; k != -1; k = ed[k].nxt)
using namespace std;
const int maxn = 10005,maxm = 1000005,INF = 1000000000;
inline int RD(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
return out * flag;
}
int co[maxn],N,M,T,nq = 0,nt = 0,ans[maxn],tot[maxm];
struct Que{int l,r,tim,b,id;}Q[maxn];
struct Cha{int pos,from,to;}C[maxn];
inline bool operator <(const Que& a,const Que& b){
if (a.b != b.b) return a.b < b.b;
else if (a.r != b.r) return a.r < b.r;
return a.tim < b.tim;
}
void solve(){
int t = nt,L = 0,R = 0,cnt = 0;
for (int i = 1; i <= nq; i++){
while (t > Q[i].tim){
if (C[t].pos >= L && C[t].pos <= R){
if (!(--tot[C[t].to])) cnt--;
if (!tot[C[t].from]++) cnt++;
}
co[C[t].pos] = C[t].from; t--;
}
while (t < Q[i].tim){
t++;
if (C[t].pos >= L && C[t].pos <= R){
if (!(--tot[C[t].from])) cnt--;
if (!tot[C[t].to]++) cnt++;
}
co[C[t].pos] = C[t].to;
}
while (L < Q[i].l){if (!(--tot[co[L++]])) cnt--;}
while (L > Q[i].l){if (!tot[co[--L]]++) cnt++;}
while (R < Q[i].r){if (!tot[co[++R]]++) cnt++;}
while (R > Q[i].r){if (!(--tot[co[R--]])) cnt--;}
ans[Q[i].id] = cnt;
}
}
int main(){
N = RD(); M = RD(); T = (int)sqrt(N); char cmd;
REP(i,N) co[i] = RD();
REP(i,M){
cmd = getchar(); while (cmd != 'Q' && cmd != 'R') cmd = getchar();
if (cmd == 'Q') Q[++nq].l = RD(),Q[nq].r = RD(),Q[nq].tim = nt,Q[nq].b = Q[nq].l / T,Q[nq].id = nq;
else C[++nt].pos = RD(),C[nt].from = co[C[nt].pos],co[C[nt].pos] = C[nt].to = RD();
}
sort(Q + 1,Q + 1 + nq);
solve();
REP(i,nq) printf("%d\n",ans[i]);
return 0;
}

BZOJ2120 数颜色 【带修改莫队】的更多相关文章

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

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

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

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

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

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

  4. bzoj 2120 数颜色 带修改莫队

    带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...

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

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

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

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

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

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

  8. P1903 [国家集训队]数颜色 带修改莫队板子

    大概就是要多加一维time 然后按照(l的块,r的块,time)为关键字排序 转移区间修改还是按照莫队的方式(每个修改要记修改前后的状态) 然后玄学dalao告诉窝块大小设为\(O(n^{\frac{ ...

  9. COGS.1901.[模板][国家集训队2011]数颜色(带修改莫队)

    题目链接 COGS BZOJ2120 洛谷P1903 /* Add和Subd函数中的vis不能直接设为=1或=0 比如 l=1,r=0 -> l=3,r=5 时,[1,5]的vis标记全都是1 ...

  10. bzoj2120: 数颜色 带修莫队

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

随机推荐

  1. 某CTF收集的Mysql爆表、爆字段语句

    Mysql特性 获取数据库名未知函数可爆数据库名 FUNCTION youcanneverfindme17.a does not exist 获取表名and linestring(pro_id)    ...

  2. Java+Selenium3自动化测试框架设计系列--href="javascript:void(0)"如何获得元素定位

    经过前面两篇文章的铺 垫,我们这篇介绍,webdriver如何处理,一个浏览器上多个窗口之间切换的问题.我们先脑补这样一个测试场景,你在页面A点击一个连接,会在新的 tab窗口打开页面B,这个时候,你 ...

  3. R语言绘图:词云图

    使用wordcloud2绘制词云图 library(wordcloud2) findwords<-function(tf){ txt<-scan(tf,"") wl&l ...

  4. codeforces 845A Chess Tourney

    参考:https://blog.csdn.net/zhongyuchen/article/details/77478039 #include <iostream> #include < ...

  5. nyoj 525 一道水题【字符串(分割)】

    参考:https://blog.csdn.net/dxx_111/article/details/48154687 #include <iostream> #include <cst ...

  6. 开学测试之——ATM

    ---恢复内容开始--- package ATM;   //信1705-2 20173568 李泽宇   import java.util.*; import java.io.File; import ...

  7. 初步学习pg_control文件之四

    接前文,初步学习pg_control文件之三  继续分析 何时出现 DB_SHUTDOWNING状态: 在正常的shutdown的时候,需要进行checkpoint,所以就在此处,设置pg_contr ...

  8. c/c++ 结构体传参问题

    c/c++的结构体传参可以有三种方式: 1.传递结构体变量,值传递 2.传递结构体指针,地址传递 3.传递结构体成员,可是值传递也可以是地址传递 根据代码示例: 1.传递结构体变量 #include& ...

  9. centos linux 因别名问题引起的麻烦及解决技巧

    老男孩儿-19期 L005-13节中分享.自己整理后发到自己微博中留档. 原文:http://oldboy.blog.51cto.com/2561410/699046 实例:老男孩linux实战培训第 ...

  10. leetcode笔记--1 two-sum

    my answer: ​​​​出现的问题:倒数第二行and i !=s这种情况没有考虑进去,以后要思考全面些