数颜色

题目描述

墨墨购买了一套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支画笔中共有几种不同颜色的画笔。

样例

样例输入

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

样例输出

4
4
3
4

数据范围与提示

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

题解:

树套树的大佬走开。。。

线段树套平衡树,树状数组套权值线段树?

或者分块?

当然没有问题。。。,但是如果没有修改,就是莫队水题

不过幸好是单点修改,我们可以对莫对进行改造,实现区间修改

再开一个时间戳,更新和L,R类似,单点删除,增加,交换

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 1000005
#define ll long long
using namespace std;
ll n,m,blo_num,col[MAXN],block[MAXN],l=1,r=0,sum[MAXN],ans=0,t=0;
ll q_sum=0,c_sum=0,out[MAXN];
struct node1{
ll l,r,id,t;
}ask[MAXN];
struct node2{
ll pos,col;
}change[MAXN];
bool cmp(const node1 x,const node1 y){
return x.l/blo_num==y.l/blo_num?(x.r/blo_num==y.r/blo_num?x.t<y.t:x.r<y.r):x.l<y.l;
}
void add(ll i){
if(!sum[i]) ans++;
sum[i]++;
}
void del(ll i){
sum[i]--;
if(!sum[i]) ans--;
}
int main(){
scanf("%lld%lld",&n,&m);
blo_num=(ll)pow(n,2.0/3.0);
for(ll i=1;i<=n;i++){
scanf("%lld",&col[i]);
block[i]=i/blo_num;
}
for(ll i=1;i<=m;i++){
char Q[5];
scanf("%s",Q);
if(Q[0]=='Q'){
q_sum++;
scanf("%lld%lld",&ask[q_sum].l,&ask[q_sum].r);
ask[q_sum].id=q_sum;
ask[q_sum].t=c_sum;
}
else{
c_sum++;
scanf("%lld%lld",&change[c_sum].pos,&change[c_sum].col);
}
}
sort(ask+1,ask+q_sum+1,cmp);
for(ll i=1;i<=q_sum;i++){
while(l<ask[i].l) del(col[l++]);
while(l>ask[i].l) add(col[--l]);
while(r<ask[i].r) add(col[++r]);
while(r>ask[i].r) del(col[r--]);
while(t<ask[i].t){
t++;
if(ask[i].l<=change[t].pos&&change[t].pos<=ask[i].r){
del(col[change[t].pos]);
add(change[t].col);
}
swap(col[change[t].pos],change[t].col);
}
while(t>ask[i].t){
if(ask[i].l<=change[t].pos&&change[t].pos<=ask[i].r){
del(col[change[t].pos]);
add(change[t].col);
}
swap(col[change[t].pos],change[t].col);
t--;
}
out[ask[i].id]=ans;
}
for(ll i=1;i<=q_sum;i++)
printf("%lld\n",out[i]);
return 0;
}

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

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

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

  2. bzoj2120: 数颜色 带修莫队

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

  3. BZOJ 2120 数颜色 (带修莫队)

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

  4. bzoj 2120 数颜色 (带修莫队)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间  l - r  内颜色的种类 ,R 单点修改 思路 ...

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

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

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

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

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

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

  8. NOI模拟 颜色 - 带修莫队/树套树

    题意: 一个颜色序列,\(a_1, a_2, ...a_i\)表示第i个的颜色,给出每种颜色的美丽度\(w_i\),定义一段颜色的美丽值为该段颜色的美丽值之和(重复的只计算一次),每次都会修改某个位置 ...

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

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

随机推荐

  1. Arthas 3.1.2 版本发布 | 增加 logger/heapdump/vmoption 命令

    最近偶尔有用户反馈某些 HTTP 接口出现超时问题,而 web 服务端的 Trace 监控没有出现 http 返回值为 503 等异常情况.出现这种情况一般是web容器出现问题,客户端连 Arthas ...

  2. 数论剩余系——cf1089F

    关于模和互质,很好的题目 /* n两个质因子 x,y有 ax+by=n-1 ax+by=n-1 ax+1+by=n y|ax+1 gcd(x,y)=1 ax%y,a取[1,y-1],就会有[1,y-1 ...

  3. VC++ MFC文件的移动复制删除更名遍历操作

    1.判断文件是否存在 利用CFile类和CFileStatus类判断 CFileStatus filestatus; if (CFile::GetStatus(_T("d://softist ...

  4. BZOJ 1087(SCOI 2005) 互不侵犯

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5333 Solved: 3101 [Submit][ ...

  5. 互联网金融ABS为何遭遇急刹车?

    互联网金融ABS为何遭遇急刹车?   今年以来,互联网金融ABS迎来爆发式增长,已逐渐成为平台融资的重要渠道.近期有媒体称,监管方面已叫停审批,原因何在? 本期看点: 互联网金融ABS与传统ABS有何 ...

  6. android GPS: code should explicitly check to see if permission is available

    转载的,感谢作者,由于我找了很久才找到这个解决方法,因此我自己再转一遍 原文链接 https://blog.csdn.net/qinwendou/article/details/77849048 if ...

  7. 缓冲(cache)和缓存(buffer)

    缓存: 指把常用数据存储到可以快速获取的区域,以备重复利用 一般叫做cache. 缓存能提高效率 缓冲: 是指在数据流转过程中,不同层次速度不一致时,利用缓冲区来缓解上下层之间速率问题(性能差异) 一 ...

  8. 左神算法进阶班1_5BFPRT算法

    在无序数组中找到第k大的数1)分组,每N个数一组,(一般5个一组)2)每组分别进行排序,组间不排序3)将每个组的中位数拿出来,若偶数,则拿上 / 下中位数, 成立一个一个新数组.4)新数组递归调用BF ...

  9. 分布式日志收集之Logstash 笔记(一)

    (一)logstash是什么? logstash是一种分布式日志收集框架,开发语言是JRuby,当然是为了与Java平台对接,不过与Ruby语法兼容良好,非常简洁强大,经常与ElasticSearch ...

  10. Python数据格式化

    Python有两种格式化字符串的方式,使用%或者使用内置format()函数. 使用%格式化字符串 在Python中使用%来格式化字符串,用法和效果类似于C语言中的%.格式为:%特定的转换类型 %da ...