2016-05-28 11:20:22

共同的思路:

维护某种颜色上一次在哪里出现pre,可以知道当pre<询问的l时更新答案

块内按照pre排序

修改的时候重新O(n)扫一遍,如果和之前的不一样,则重置所在块

查询时和普通分块一样,整块二分,两边暴力

BZOJ2453 http://www.lydsy.com/JudgeOnline/problem.php?id=2453

BZOJ2120 http://www.lydsy.com/JudgeOnline/problem.php?id=2120

  1. #include<bits/stdc++.h>
  2. #define inf 1000000000
  3. #define ll long long
  4. #define N 10005
  5. #define M 1000005
  6. using namespace std;
  7. int read(){
  8. int x=,f=;char ch=getchar();
  9. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  10. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  11. return x*f;
  12. }
  13. int block,n,m,q;
  14. int a[N],b[N],c[N],pre[M],pos[N];
  15. char ch[];
  16. void reset(int x){
  17. int l=(x-)*block+,r=min(x*block,n);
  18. for(int i=l;i<=r;i++)b[i]=a[i];
  19. sort(b+l,b+r+);
  20. }
  21. void update(int x,int v){
  22. for(int i=;i<=n;i++)pre[c[i]]=;
  23. c[x]=v;
  24. for(int i=;i<=n;i++){
  25. int t=a[i];
  26. a[i]=pre[c[i]];
  27. if(t!=a[i])reset(pos[i]);
  28. pre[c[i]]=i;
  29. }
  30. }
  31. int find(int x,int v){
  32. int l=(x-)*block+,r=x*block,mid,tmp;
  33. while(l<=r){
  34. mid=l+r>>;
  35. if(b[mid]<v)tmp=mid,l=mid+;
  36. else r=mid-;
  37. }
  38. return tmp-(x-)*block;
  39. }
  40. int query(int l,int r){
  41. int ans=;
  42. if(pos[l]==pos[r]){
  43. for(int i=l;i<=r;i++)if(a[i]<l)ans++;
  44. }
  45. else{
  46. for(int i=l;i<=block*pos[l];i++)if(a[i]<l)ans++;
  47. for(int i=(pos[r]-)*block+;i<=r;i++)if(a[i]<l)ans++;
  48. }
  49. for(int i=pos[l]+;i<pos[r];i++)ans+=find(i,l);
  50. return ans;
  51. }
  52. int main(){
  53. n=read();q=read();
  54. for(int i=;i<=n;i++){
  55. c[i]=read();a[i]=pre[c[i]];
  56. pre[c[i]]=i;
  57. }
  58. block=(int)sqrt(n);
  59. for(int i=;i<=n;i++)pos[i]=(i-)/block+;
  60. if(n%block)m=n/block+;else m=n/block;
  61. for(int i=;i<=m;i++)reset(i);
  62. while(q--){
  63. scanf("%s",ch);
  64. int x=read(),y=read();
  65. if(ch[]=='Q')printf("%d\n",query(x,y));
  66. else update(x,y);
  67. }
  68. return ;
  69. }

BZOJ2453维护队列&&BZOJ2120数颜色的更多相关文章

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

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

  2. [bzoj2453]维护队列_带修改莫队

    维护队列 bzoj-2453 题目大意:给定一个n个数序列,支持查询区间数的种类数,单点修改.不强制在线. 注释:$1\le n,m\le 10^5$. 想法: 带修改莫队裸题. 如果没有修改操作的话 ...

  3. BZOJ2453: 维护队列

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 183  Solved: 89[Submit][Status] Descripti ...

  4. bzoj2120 数颜色 莫队 带修改

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

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

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

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

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

  7. BZOJ2120 数颜色(树套树)

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

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

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

  9. bzoj2120: 数颜色 &&bzoj2453: 维护队列

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

随机推荐

  1. Delphi中record和packed record的区别

    转载:http://blog.csdn.net/rznice/article/details/6566978 第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐. 而第二种带packe ...

  2. url地址中 "&" "/"等符号的转义处理(转)

    URL出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好? 解决办法:将这些字符转化成服务器可以识别的字符,对应关系如下: URL中的特殊字 ...

  3. Android开发学习笔记:浅谈WebView(转)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 ...

  4. HDU 5791 Two DP

    Two   Problem Description   Alice gets two sequences A and B. A easy problem comes. How many pair of ...

  5. loj 1357(树形dp)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1357 #define _CRT_SECURE_NO_WARNINGS #include ...

  6. python客户端编程

    上一篇说了最为底层的用来网络通讯的套接字.有很多基于套接字的一些协议,这些协议构成了当今互联网大多数客户服务器应用的核心 其实这些协议时在套接字上面的进一层封装用来完成特定的应用,这些应用主要包括: ...

  7. 驱动中获取PsActiveProcessHead变量地址的五种方法也可以获取KdpDebuggerDataListHead

    PsActiveProcessHead的定义: 在windows系统中,所有的活动进程都是连在一起的,构成一个双链表,表头是全局变量PsActiveProcessHead,当一个进程被创建时,其Act ...

  8. java Clone使用方法详解

    java"指针"       Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能 通过 ...

  9. 编解码-protobuf

    Google的Protobuf在业界非常流行,很多商业项目选择Protobuf作为编解码框架,Protobuf的优点. (1)在谷歌内部长期使用,产品成熟度高: (2)跨语言,支持多种语言,包括C++ ...

  10. AngularJS学习之输入验证

    1.AngularJS可以验证表单和控件可以验证输入的数据: 2.输入验证:客户端不能确保用户输入数据的安全,所以服务器端的数据验证也是必须的: 3.应用实例: <! DOCTYPE html& ...