2453: 维护队列

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 578  Solved: 247
[Submit][Status][Discuss]

Description

你小时候玩过弹珠吗?
小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N。为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少。当然,A有时候会依据个人喜好,替换队列中某个弹珠的颜色。但是A还没有学过编程,且觉得头脑风暴太浪费脑力了,所以向你来寻求帮助。

Input

输入文件第一行包含两个整数N和M。
第二行N个整数,表示初始队列中弹珠的颜色。
接下来M行,每行的形式为“Q L R”或“R x c”,“Q L R”表示A想知道从队列第L个弹珠到第R个弹珠中,一共有多少不同颜色的弹珠,“R x c”表示A把x位置上的弹珠换成了c颜色。

Output

对于每个Q操作,输出一行表示询问结果。

Sample Input


2 3
1 2
Q 1 2
R 1 2
Q 1 2

Sample Output

2
1

HINT

对于100%的数据,有1 ≤ N ≤ 10000, 1 ≤ M ≤ 10000,小朋友A不会修改超过1000次,所有颜色均用1到10^6的整数表示。

Source

2011福建集训

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define MAXN 10010
 4 #define MAXM 1000010
 5 int n,a[MAXN],last[MAXN],pre[MAXM],block,pos[MAXN],h[MAXN];
 6 int read()
 7 {
 8     int s=0,fh=1;char ch=getchar();
 9     while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
10     while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
11     return s*fh;
12 }
13 void cl(int k)
14 {
15     int l=(k-1)*block+1,r=min(n,k*block),i;
16     for(i=l;i<=r;i++)a[i]=last[i];
17     sort(a+l,a+r+1);
18 }
19 void Change(int x,int c)
20 {
21     int i,t;
22     for(i=1;i<=n;i++)pre[h[i]]=0;
23     h[x]=c;
24     for(i=1;i<=n;i++)
25     {
26         t=last[i];
27         last[i]=pre[h[i]];
28         if(t!=last[i])cl(pos[i]);
29         pre[h[i]]=i;
30     }
31 }
32 int Find(int k,int ll)
33 {
34     int l=(k-1)*block+1,r=min(k*block,n),mid,t=0;
35     while(l<=r)
36     {
37         mid=(l+r)/2;
38         if(a[mid]>=ll)r=mid-1;
39         else if(a[mid]<ll)t=mid,l=mid+1;
40     }
41     if(t==0)return 0;
42     else return t-((k-1)*block+1)+1;
43 }
44 int Query(int l,int r)
45 {
46     int ans=0,i;
47     if(pos[l]==pos[r])
48     {
49         for(i=l;i<=r;i++)if(last[i]<l)ans++;
50     }
51     else
52     {
53         for(i=l;i<=pos[l]*block;i++)if(last[i]<l)ans++;
54         for(i=(pos[r]-1)*block+1;i<=r;i++)if(last[i]<l)ans++;
55         for(i=pos[l]+1;i<=pos[r]-1;i++)ans+=Find(i,l);
56     }
57     return ans;
58 }
59 int main()
60 {
61     int M,i,m,s1,s2;
62     char fh[2];
63     n=read();M=read();
64     block=(int)sqrt(n);
65     memset(last,0,sizeof(last));
66     memset(pre,0,sizeof(pre));
67     for(i=1;i<=n;i++)
68     {
69         h[i]=read();
70         last[i]=pre[h[i]];
71         pre[h[i]]=i;
72         pos[i]=(i-1)/block+1;
73     }
74     if(block*block==n)m=n/block;
75     else m=n/block+1;
76     for(i=1;i<=m;i++)cl(i);
77     for(i=1;i<=M;i++)
78     {
79         scanf("\n%s",fh);s1=read();s2=read();
80         if(fh[0]=='Q')
81         {
82             printf("%d\n",Query(s1,s2));
83         }
84         else Change(s1,s2);
85     }
86     return 0;
87 }

View Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[10010];
 4 bitset<1000010> vis;
 5 int main()
 6 {
 7     int n,m,i,l,r,sum,j;
 8     char fh;
 9     scanf("%d %d",&n,&m);
10     for(i=1;i<=n;i++)scanf("%d",&a[i]);
11     for(i=1;i<=m;i++)
12     {
13         scanf("\n%c %d %d",&fh,&l,&r);
14         if(fh=='Q')
15         {
16             vis.reset();
17             sum=0;
18             for(j=l;j<=r;j++)if(vis[a[j]]==0){sum++;vis[a[j]]=1;}
19             printf("%d\n",sum);
20         }
21         else
22         {
23             a[l]=r;
24         }
25     }
26     return 0;
27 }

View Code

转载于:https://www.cnblogs.com/Var123/p/5269885.html

Bzoj 2453: 维护队列 Bzoj 2120: 数颜色 分块,bitset相关推荐

  1. BZOJ 2453 维护队列

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

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

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

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

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

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

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

  5. BZOJ 2120: 数颜色

    2120 思路1:树状数组套主席树 #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include&l ...

  6. 【BZOJ】2120: 数颜色

    题解 练习一下带修改莫队 先按照左端点的块排序,再按照右端点的块排序,然后按照时间排序 每个修改操作存一下修改前这个位置的值就可以逆序操作了 代码 #include <bits/stdc++.h ...

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

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

  8. BZOJ 2141 排队(块套树,分块,树状数组)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2141 是 hydro 的 BZOJ ...

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

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

最新文章

  1. 【Linux】Linux简单操作之vi与vim编辑器
  2. 今日 Paper | 虚拟试穿网络;人群计数基准;联邦元学习;目标检测等
  3. 俩台电脑怎么设置同一局域网_【必看】局域网ip地址不够用怎么办?
  4. 011 吃药call功能分析和代码编写
  5. URAL 1091. Tmutarakan Exams
  6. Highcharts 中文参考文档
  7. matlab窗函数 响应,matlab窗函数设计方案.doc
  8. UIKit应用 - Swift 版本: 3.让UITableViewCell的背景色渐变
  9. PHP利用PDO从mysql读取大量数据处理(可做大量数据集的导出,业务调整等)
  10. linux 如何安装Python3.5
  11. 底部按钮吸附_知乎的药丸按钮(二)我的 iOS 实现
  12. VBS操作注册表设置新建读取,删除等操作(更新中)
  13. 【原创】Linux下追加磁盘空间的方法
  14. 基于阿里云服务器使用宝塔面板进行Hexo建站
  15. mysql读写分离优点_mysql读写分离
  16. 学校计算机社团面试问题及答案,社团二轮面试题目
  17. 全球 26 个主流视频网站高清视频下载全搞定,包括 P 站!
  18. papers with code介绍(人工智能方向研究生的必备网站)
  19. 丝滑!CVPR 2021 视频插帧论文+开源代码汇总
  20. Centos7 源码编译安装linux longterm 内核4.19.47

热门文章

  1. mooc c语言测验答案,MOOC-SPOC测试题(部分答案)(至数组一章)-C语言-宣城校区2016年...
  2. python rpc微服务框架_grpc的微服务探索实践
  3. 基于ssm的用户管理系统_基于SSM的高校学生实习管理系统
  4. ant指定servlet版本_Spring工具 - AntPathMatcherUrlPathHelper(针对URL进行处理)
  5. 《系统集成项目管理工程师》必背100个知识点-03项目管理过程组
  6. 笔记-项目采购管理-索赔的处理
  7. Vue中使用vue-video-player和videojs-flash插件实现播放rtmp视频文件流
  8. Leaflet中使用Leaflet.Pin插件实现图层要素编辑效果
  9. Vue中怎样封装与使用公共状态属性组件实现类似枚举类的效果
  10. C#中面向对象初使用-实现问好窗体程序