【BZOJ 2453|bzoj 2120】 2453: 维护队列 (分块+二分)
2453: 维护队列
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 2Sample Output
2
1HINT
对于100%的数据,有1 ≤ N ≤ 10000, 1 ≤ M ≤ 10000,小朋友A不会修改超过1000次,所有颜色均用1到10^6的整数表示。
Source
【分析】
跟BZOJ 3343 差不多。
对序列求一个next,next[i]表示下一个和i同颜色的是谁(如果他是最后一个的这种颜色,那么next为正无穷)
问题转换成计算区间[l,r]里面next大于r的有多少个,单点修改。
转化成跟BZOJ 3343 一样的模型。
根号n分块,块内要排序。next这条链的删除和插入可以暴力枚举,因为数据范围很小。
时间复杂度是O(q*√n log(√n)+q*n)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 10010
#define Maxd 1000010 int a[Maxn],pos[Maxn],ft[Maxn],rt[Maxn];
int nt[Maxn],lt[Maxd],b[Maxn];
int n; bool cmp(int x,int y) {return x>y;} void upd(int x)
{
for(int i=ft[x];i<=rt[x];i++) b[i]=nt[i];
sort(b+ft[x],b++rt[x],cmp);
} void change(int x,int y)
{
if(lt[a[x]]==x)
{
lt[a[x]]=nt[x];
}
else
{
for(int i=lt[a[x]];i<=n;i=nt[i]) if(nt[i]==x)
{
nt[i]=nt[x];
upd(pos[i]);
break;
}
}
if(x<lt[y])
{
nt[x]=lt[y];
lt[y]=x;
}
else
{
for(int i=lt[y];i<=n;i=nt[i]) if(nt[i]>x)
{
nt[x]=nt[i];
nt[i]=x;
upd(pos[i]);
break;
}
}
upd(pos[x]);
a[x]=y;
} int ffind(int x,int y)
{
int l=ft[x],r=rt[x];
if(b[l]<y) return ;
while(l<r)
{
int mid=(l+r+)>>;
if(b[mid]>y) l=mid;
else r=mid-;
}
return l-ft[x]+;
} int query(int x,int y)
{
int ans=;
if(pos[x]==pos[y])
{
for(int i=x;i<=y;i++) if(nt[i]>y) ans++;
}
else
{
for(int i=x;i<=rt[pos[x]];i++) if(nt[i]>y) ans++;
for(int i=ft[pos[y]];i<=y;i++) if(nt[i]>y) ans++;
for(int i=pos[x]+;i<pos[y];i++) ans+=ffind(i,y);
}
return ans;
} int main()
{
int m,sq;
scanf("%d%d",&n,&m);
sq=(int)ceil(sqrt((double)n));
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=Maxd;i++) lt[i]=n+;
for(int i=n;i>=;i--) nt[i]=lt[a[i]],lt[a[i]]=i;
for(int i=;i<=n;i++) pos[i]=(i-)/sq+;
for(int i=;i<n;i++) if(pos[i]!=pos[i+]) ft[pos[i+]]=i+,rt[pos[i]]=i;
ft[]=;rt[pos[n]]=n;
for(int i=;i<=n;i++) b[i]=nt[i];
for(int i=;i<=pos[n];i++) sort(b+ft[i],b++rt[i],cmp); for(int i=;i<=m;i++)
{
char s[];
int x,y;
scanf("%s%d%d",s,&x,&y);
if(s[]=='R')
{
change(x,y);
}
else
{
printf("%d\n",query(x,y));
}
}
return ;
}
2016-12-12 13:52:29
【BZOJ 2453|bzoj 2120】 2453: 维护队列 (分块+二分)的更多相关文章
- 【BZOJ2473/2120】维护队列 分块+二分
Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会 ...
- 【bzoj2453】维护队列 (分块 + 二分)
传送门(权限题) 题目分析 题意为:求区间内有多少种不同的数,带修改. 首先对原序列分块,用last[i]表示与i相同的上一个在哪里,然后将分块后的数组每个块内的按照last进行排序,这样查询时就可以 ...
- 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 653 Solved: 283[Submit][Status][Discuss] ...
- BZOJ 2453 维护队列 | 分块
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2453 题解: 考虑维护每个位置的颜色上一次出现在哪里,计为pre[i],在询问l到r的时候, ...
- [BZOJ2453]维护队列|分块
Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会 ...
- Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 578 Solved: 247[Submit][Status][Discuss] ...
- bzoj 2453 : 维护队列 带修莫队
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 952 Solved: 432[Submit][Status][Discuss] ...
- bzoj 2453: 维护队列
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1079 Solved: 503[Submit][Status][Discuss ...
- BZOJ2120&&2453 数颜色&&维护队列
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1442 Solved: 678 [Submit][Status][Discuss ...
随机推荐
- Oracle + Entity Framework 更新没有设置主键的表
最近用Entity Framework 开发的时候,发现一个问题,在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作. 那么,应该怎么处理没有主键的表呢? 我们打开这个表的edmx文件 ...
- Java 对于继承的初级理解
概念:继承,是指一个类的定义可以基于另外一个已存在的类,即子类继承父类,从而实现父类的代码的重用.两个类的关系:父类一般具有各个子类共性的特征,而子类可以增加一些更具个性的方法.类的继承具有传递性,即 ...
- 为mapcontrol中的图层设置透明度
ILayer pLayer = axMapControl1.get_Layer(); ILayerEffects pLayerEffects = (ILayerEffects)pLayer; pLay ...
- 输入与enter
#include<iostream> using namespace std; int main() { char a,b,c; while(scanf("%c%c%c" ...
- 如何禁止KnockoutJs在VS2012的智能格式化
http://blogs.msdn.com/b/webdev/archive/2013/03/04/disabling-knockout-intellisense.aspx 我升级了一下VS2012, ...
- 一次GC问题定位
同事有段代码执行时间过长,需要进行优化, Hashmultimap<Int,Bean> map = ...; for (400w*96) { // 计算过程 Bean = doComput ...
- DEV GridControl表格数据源为空在表格中间显示提醒字符
private static void gv_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.Custo ...
- LESS学习总结
之前在工作过程中,用到了Less,一直没有将学习心得整理归纳,今天终于空出时间整理了一下. Less学习常用参考文档: Less 中文网 http://lesscss.cn/ 快速入门 | Les ...
- ActiveMq+zookeeper+levelDB集群整合配置
ActiveMq+zookeeper+levelDB集群整合配置 环境:linux系统,jdk1.7 三台linux系统电脑.我这里使用一台window,分别远程3台linux电脑.三台电脑的ip分 ...
- PHP 跨域写cookie
实际工作中,类似这样的要求很多,比如说,我们有两个域名,我们想实现在一个域名登录后,能自动完成另一个域名的登录,也就是PASSPORT的功能. 我只写一个大概,为了测试的方便,先编辑hosts文件,加 ...