BZOJ2120 数颜色


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。


挺好的一道带修改莫队入门题

一开始没有考虑在修改的基础上进行累加,不能一直从原状态上进行累加,因为时间是固定的,所以我们可以保证修改一定是有序的

就是代码中的last数组

其他没什么好说的,但是提醒一下,虽然sqrt(n)也可以过,但是siz取n的三分之二次方最优


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define N 1000010
  4. struct Node{int pos,x,y;}t[N];
  5. struct Ask{int l,r,id,tim;}p[N];
  6. int block[N],a[N],last[N],ans[N],cnt[N];
  7. int n,m,totp=0,tott=0;
  8. int l=1,r=0,tmp=0,ansnow=0;
  9. bool cmp1(Ask a,Ask b){
  10. if(block[a.l]==block[b.l])return a.r<b.r;
  11. else return block[a.l]<block[b.l];
  12. }
  13. void modify(int pos,int y){
  14. if(l<=pos&&pos<=r){
  15. if(--cnt[a[pos]]==0)ansnow--;
  16. a[pos]=y;
  17. if(++cnt[a[pos]]==1)ansnow++;
  18. }else a[pos]=y;
  19. }
  20. void update(int pos,int typ){
  21. if(typ==1)ansnow+=(++cnt[a[pos]]==1);
  22. else ansnow-=(--cnt[a[pos]]==0);
  23. }
  24. int main(){
  25. scanf("%d%d",&n,&m);
  26. for(int i=1;i<=n;i++)scanf("%d",&a[i]),last[i]=a[i];
  27. for(int i=1;i<=m;i++){
  28. char c[5];int x,y;
  29. scanf("%s%d%d",c,&x,&y);
  30. if(c[0]=='Q')p[++totp]=(Ask){x,y,totp,tott};
  31. else{
  32. t[++tott]=(Node){x,last[x],y};
  33. last[x]=y;
  34. }
  35. }
  36. int siz=sqrt(n);
  37. for(int i=1;i<=n;i++)block[i]=(i-1)/siz+1;
  38. sort(p+1,p+totp+1,cmp1);
  39. for(int i=1;i<=totp;i++){
  40. while(tmp<p[i].tim)++tmp,modify(t[tmp].pos,t[tmp].y);
  41. while(tmp>p[i].tim)modify(t[tmp].pos,t[tmp].x),tmp--;
  42. while(l<p[i].l)update(l++,-1);
  43. while(l>p[i].l)update(--l,1);
  44. while(r<p[i].r)update(++r,1);
  45. while(r>p[i].r)update(r--,-1);
  46. ans[p[i].id]=ansnow;
  47. }
  48. for(int i=1;i<=totp;i++)printf("%d\n",ans[i]);
  49. return 0;
  50. }

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】数颜色 带修莫队

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

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

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

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

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

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

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

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

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

随机推荐

  1. keepalived与nginx安装

    目的: 当用户请求访问时,会通过nginx来访问web服务应用,因此我们必须要保证nginx的高可用,要保证nginx的高可用,我们需要通过keepalived来监控nginx,并对外提供1个虚拟的v ...

  2. SpringBoot 玩转读写分离

    环境概览 前言介绍 Sharding-JDBC是当当网的一个开源项目,只需引入jar即可轻松实现读写分离与分库分表.与MyCat不同的是,Sharding-JDBC致力于提供轻量级的服务框架,无需额外 ...

  3. [java]Stream API——collect、reduce、orElse(x)

    一.collect 1.R collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner) supplier:一个能创造 ...

  4. nginx 日志搜集解决方案

    # nginx 日志搜集解决方案 ## 系统环境描述 ``` java8 logstash --监控nginx日志文件 ``` ## 技术描述 ``` 通过logstash监控nginx access ...

  5. python判断指定路径是否存在

    https://www.cnblogs.com/jhao/p/7243043.html

  6. 已知起始点,获取每段等距离途经点的经纬度(用百度js api作)

    已知两个中文地址,自动规划路径,获取路径上每个3公里的点的经纬度 <html> <head> <meta http-equiv="Content-Type&qu ...

  7. Java多态性的理解2

    多态的基础理解请参考:http://www.cnblogs.com/liujinhong/p/6003144.html Java的多态一直是我们理解的一个难点.在读过<深入理解Java虚拟机&g ...

  8. Java集合详解8:Java的集合类细节精讲

    Java集合详解8:Java集合类细节精讲 今天我们来探索一下Java集合类中的一些技术细节.主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充.可能不全面,还请谅解. 本文参考:http:// ...

  9. centos7 卸载安装失败的mysql7

    1.查询现在的服务器上面的mysql已经安装了什么内容: rpm -qa |grep -i mysql 2.开始卸载执行命令: yum remove mysql-community-common-5. ...

  10. BZOJ 1003 [ZJOI2006]物流运输trans ★(Dijkstra + DP)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1003 思路 先Dijkstra暴力求出i..j天内不变换路线的最少花费,然后dp[i] = ...