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 2

Sample Output

2
1

HINT

对于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: 维护队列 (分块+二分)的更多相关文章

  1. 【BZOJ2473/2120】维护队列 分块+二分

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

  2. 【bzoj2453】维护队列 (分块 + 二分)

    传送门(权限题) 题目分析 题意为:求区间内有多少种不同的数,带修改. 首先对原序列分块,用last[i]表示与i相同的上一个在哪里,然后将分块后的数组每个块内的按照last进行排序,这样查询时就可以 ...

  3. 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 653  Solved: 283[Submit][Status][Discuss] ...

  4. BZOJ 2453 维护队列 | 分块

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2453 题解: 考虑维护每个位置的颜色上一次出现在哪里,计为pre[i],在询问l到r的时候, ...

  5. [BZOJ2453]维护队列|分块

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

  6. Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 578  Solved: 247[Submit][Status][Discuss] ...

  7. bzoj 2453 : 维护队列 带修莫队

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 952  Solved: 432[Submit][Status][Discuss] ...

  8. bzoj 2453: 维护队列

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1079  Solved: 503[Submit][Status][Discuss ...

  9. BZOJ2120&&2453 数颜色&&维护队列

    2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1442 Solved: 678 [Submit][Status][Discuss ...

随机推荐

  1. Oracle + Entity Framework 更新没有设置主键的表

    最近用Entity Framework 开发的时候,发现一个问题,在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作. 那么,应该怎么处理没有主键的表呢? 我们打开这个表的edmx文件 ...

  2. Java 对于继承的初级理解

    概念:继承,是指一个类的定义可以基于另外一个已存在的类,即子类继承父类,从而实现父类的代码的重用.两个类的关系:父类一般具有各个子类共性的特征,而子类可以增加一些更具个性的方法.类的继承具有传递性,即 ...

  3. 为mapcontrol中的图层设置透明度

    ILayer pLayer = axMapControl1.get_Layer(); ILayerEffects pLayerEffects = (ILayerEffects)pLayer; pLay ...

  4. 输入与enter

    #include<iostream> using namespace std; int main() { char a,b,c; while(scanf("%c%c%c" ...

  5. 如何禁止KnockoutJs在VS2012的智能格式化

    http://blogs.msdn.com/b/webdev/archive/2013/03/04/disabling-knockout-intellisense.aspx 我升级了一下VS2012, ...

  6. 一次GC问题定位

    同事有段代码执行时间过长,需要进行优化, Hashmultimap<Int,Bean> map = ...; for (400w*96) { // 计算过程 Bean = doComput ...

  7. DEV GridControl表格数据源为空在表格中间显示提醒字符

    private static void gv_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.Custo ...

  8. LESS学习总结

    之前在工作过程中,用到了Less,一直没有将学习心得整理归纳,今天终于空出时间整理了一下.   Less学习常用参考文档: Less 中文网 http://lesscss.cn/ 快速入门 | Les ...

  9. ActiveMq+zookeeper+levelDB集群整合配置

    ActiveMq+zookeeper+levelDB集群整合配置 环境:linux系统,jdk1.7  三台linux系统电脑.我这里使用一台window,分别远程3台linux电脑.三台电脑的ip分 ...

  10. PHP 跨域写cookie

    实际工作中,类似这样的要求很多,比如说,我们有两个域名,我们想实现在一个域名登录后,能自动完成另一个域名的登录,也就是PASSPORT的功能. 我只写一个大概,为了测试的方便,先编辑hosts文件,加 ...