分块,在每个点记录一下它之前离它最近的相同颜色的位置pre[i],显然问题转化成了求[l,r]中pre[i]<l的值的个数。

这是分块擅长的,在每个块内记录有序表,查询时对零散的暴力,整块的二分即可。

修改时有点麻烦,设修改a[p]。

可能会对pre[p]产生影响;

可能会对p位置之后的第一个 与a[p]修改前相等的值 的pre 产生影响;

可能会对p位置之后的第一个 与a[p]修改后相等的值 的pre 产生影响。

细节蛮多,调了很久。<---蒟蒻。

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m,sz,sum,l[30],r[30],num[10001],pre[10001],preb[10001],a[10001],x,y,pos[1000001];
 7 int Res,Num;char C,CH[12];
 8 inline int G()
 9 {
10     Res=0;C='*';
11     while(C<'0'||C>'9')C=getchar();
12     while(C>='0'&&C<='9'){Res=Res*10+(C-'0');C=getchar();}
13     return Res;
14 }
15 inline void P(int x)
16 {
17     Num=0;if(!x){putchar('0');puts("");return;}
18     while(x>0)CH[++Num]=x%10,x/=10;
19     while(Num)putchar(CH[Num--]+48);
20     puts("");
21 }
22 void makeblock()
23 {
24     sz=sqrt((double)n*log2(n)); if(!sz) sz=1;
25     for(sum=1;sum*sz<n;sum++)
26       {
27         l[sum]=(sum-1)*sz+1;
28         r[sum]=sum*sz;
29           for(int i=l[sum];i<=r[sum];i++)
30           num[i]=sum;
31       }
32     l[sum]=sz*(sum-1)+1;
33     r[sum]=n;
34     for(int i=l[sum];i<=r[sum];i++)
35       num[i]=sum;
36 }
37 void makepre()
38 {
39     for(int i=1;i<=n;i++) {pre[i]=pos[a[i]]; pos[a[i]]=i;}
40     memcpy(preb,pre,sizeof(pre));
41     for(int i=1;i<=sum;i++) sort(pre+l[i],pre+r[i]+1);
42 }
43 inline void query()
44 {
45     int res=0;
46     if(num[x]+1>=num[y]) {for(int i=x;i<=y;i++) if(preb[i]<x) res++;}
47     else
48       {
49           for(int i=x;i<=r[num[x]];i++) if(preb[i]<x) res++;
50           for(int i=l[num[y]];i<=y;i++) if(preb[i]<x) res++;
51           for(int i=num[x]+1;i<num[y];i++) res+=lower_bound(pre+l[i],pre+r[i]+1,x)-(pre+l[i]);
52       }
53     P(res);
54 }
55 inline void update()
56 {
57     int t=0;
58     for(int i=x+1;i<=n;i++)
59       if(a[i]==y)
60         {*lower_bound(pre+l[num[i]],pre+r[num[i]],preb[i])=x; preb[i]=x;
61         sort(pre+l[num[i]],pre+r[num[i]]+1); break;}
62     a[0]=y;
63     for(int i=x-1;i>=0;i--)
64       if(a[i]==y)
65         {*lower_bound(pre+l[num[x]],pre+r[num[x]],preb[x])=i; preb[x]=i;
66         sort(pre+l[num[x]],pre+r[num[x]]+1); break;}
67     int t2=a[x]; a[x]=y;
68     for(int i=x;i>=1;i--)
69       if(a[i]==t2)
70         {t=i; break;}
71     for(int i=x+1;i<=n;i++)
72       if(a[i]==t2)
73         {*lower_bound(pre+l[num[i]],pre+r[num[i]],preb[i])=t; preb[i]=t;
74         sort(pre+l[num[i]],pre+r[num[i]]+1); break;}
75 }char op[1];
76 int main()
77 {
78     n=G();m=G();
79     for(int i=1;i<=n;i++) a[i]=G();
80     makeblock(); makepre();
81     for(int i=1;i<=m;i++)
82       {
83         scanf("%s",op);x=G();y=G();
84           if(op[0]=='Q') query();
85           else update();
86       }
87     return 0;
88 }

转载于:https://www.cnblogs.com/autsky-jadek/p/4020296.html

【分块】bzoj2120 数颜色相关推荐

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

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

  2. 2120: 数颜色(带修莫队)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 2120: 数颜色 Time Limit: 6 Sec  Memory Limit ...

  3. 莫队入门例题之持久化莫队:2120: 数颜色

    ·述大意:        多个区间询问,询问[l,r]中颜色的种类数.可以单点修改颜色. ·分析: 莫队可以修改?那不是爆炸了吗. 这类爆炸的问题被称为带修莫队(可持久化莫队). 按照美妙类比思想,可 ...

  4. python使用matplotlib可视化:设置坐标轴的范围、设置主次坐标轴刻度、坐标轴刻度显示样式、坐标轴刻度数颜色、小数点位数、坐标轴刻度网格线、线条类型、数据点形状标签、文本字体、颜色、大小等

    python使用matplotlib可视化:设置坐标轴的范围.设置主次坐标轴刻度.坐标轴刻度显示样式.坐标轴刻度数颜色.小数点位数.坐标轴刻度网格线.线条类型.数据点形状标签.文本字体.颜色.大小等 ...

  5. The 2020 ICPC Asia Macau Regional Contest J. Jewel Grab(数颜色+链表)

    J. Jewel Grab Tartarus _Wallace_ 转化询问:对于一个询问 [s,k],找到一个最长的区间 [s,t],满足区间中出现次数超过一次的元素,的出现次数减一,的和,不超过 k ...

  6. 【算法讲20:Dsu on Tree】树上数颜色 | Lomsat gelral

    [算法讲20:Dsu on Tree] [例一:树上数颜色] · 暴力做法 · · 考虑优化 · ⌈ D s u o n T r e e ⌋ \lceil Dsu\ on\ Tree\rfloor ⌈ ...

  7. P3939 数颜色 (权值线段树)

    题目链接: P3939 数颜色 大致题意 略 解题思路 权值线段树 对于这个题, 由于询问的是, 对于c颜色, [l, r]区间有多少该颜色的兔子. 相当于每次询问的就是一种颜色的区间查询. 假设颜色 ...

  8. 洛谷P3939 数颜色 vector乱搞

    洛谷P3939 数颜色 标签 vector乱搞 简明题意 给一个序列(n <= 3e5),现需要你支持两种操作. 询问区间[L,R]中有多少个值为x的数 交换第k和k+1个数 思路 首先,这题需 ...

  9. [国家集训队]数颜色

    [国家集训队]数颜色 题解 很水的一道带修莫队板子题. 我们只需要将操作时间看作是当前询问的第三维,排序后跑莫队即可. 三维莫队块长为n23n^{\frac{2}{3}}n32​时时间复杂度是最优的, ...

  10. 洛谷-P1903 数颜色 分块 bitset

    题目 题目链接 题意 给你一个数列代表不同的颜色(可以修改). 询问一段区间内有多少种颜色. 题解 很容易想到的就是线段树来维护bitset. 这里为了练习,使用分块维护bitset. * 事实上线段 ...

最新文章

  1. mysql innodbuffer修改_mysql参数之innodb_buffer_pool_size大小设置
  2. nodejs+html转换pdf,Nodejs中使用phantom将html转为pdf或图片格式的方法
  3. sql with as 用法
  4. 【转】名企献身说法:我们喜欢这样的简历
  5. 简洁后台管理非常简洁
  6. 单调栈求全1(或全0)子矩阵的个数 洛谷P5300与或和 P3400仓鼠窝
  7. ubuntu16.04下ROS操作系统学习笔记(二)命令工具了解和仿真小海龟
  8. Solana代码解析
  9. 快速筛选打卡时间日期等数据:EXCEL筛选查找某一时间点是否在某一时间段内
  10. 美团热修复 Robust 方案接入(一)
  11. android 联机游戏平台,游聚平台/街机平台/主机联网/街机对战平台/网络街机
  12. 曾国藩《挺经》卷七英才
  13. 人工智能会取代艺术家?
  14. TensorFlow学习笔记12----Creating Estimators in tf.contrib.learn
  15. 计算机视觉技术的应用实例,图像识别技术都有哪些?图像识别技术原理及应用实例...
  16. 台式计算机硬盘英寸,浅谈3.5英寸硬盘与2.5英寸硬盘的区别
  17. 吕雉到底是一个怎样的人?
  18. sdnu.1026 田忌赛马续
  19. JQuary元素操作
  20. 了解黑客常用的工具,我也能反黑了

热门文章

  1. mysql运维知识_Mysql运维知识
  2. 暑假NOIP期末考试【1】—— Phantom
  3. dpkg 被中断,您必须手工运行 sudo dpkg -configure -a 解决
  4. Javascript之基本包装类型
  5. 〔转〕Word域的应用和详解2_等式和公式域
  6. redis java客户端封装_redis的java客户端Jedis简单封装
  7. android push php,Android_android push推送相关基本问答总结,通知和消息有什么区别?通 - phpStudy...
  8. java中JFrame.setSize,Java JFrame .setSize(x, y) not working?
  9. 3. mysql的注解驱动的三种方式_注册 Jdbc 驱动程序的三种方式及Class.forName 的作用...
  10. python 100 days github_GitHub - Andyhe2019/Python-100-Days: Python - 100天从新手到大师