【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 ...
随机推荐
- Swift方法
Swift 中的方法是与特定类型(类和结构体)相关的函 数. 实例方法 隶属于某个特定类型(类或结构体)实例函数. class Counter{ var count = 0 funcincrement ...
- 在swift中使用MJRefresh
cocoapod导入的,并且桥接已经完成,但是就是不提示方法,醉了,
- maven入门程序(二)
这里就使用myeclipse简单创建一个实例程序. 一.创建项目 在myeclipse中创建项目选Maven Project,然后直接下一步用默认的项目空间.在archetype中选择quicksta ...
- c#基础笔记-----------集合
首先所谓集合是用于管理对象的容器类.一方面集合将独立的对象汇集成群集,作为一个群集来管理,以便进行整体性操作:而另一方面,集合可以方便地获取群集中的个体,进行个体化操作.在.Net中,集合被封装为对象 ...
- 返璞归真vc++之感言
本人自述,大专学历,感觉自己也属于好学型学生,历任班上学习委员3年有余,参与学校项目几多个,不知道不觉从11年毕业已有3个年头,3年来,不敢苟同自己的生活方式,奈何人生无奈..从刚开始的电子商务公司转 ...
- [java学习笔记]java语言核心----面向对象基础
1.面向对象概述 面向对象是java语言的核心.是对应于面向过程而言的. 面向过程:强调的是过程,即动作.在java中动作就是函数.C语言就是面向过程的. 如:把大象装进冰箱需要几步? 答:需要三步: ...
- httpd配置Gzip压缩
以下设置在 /etc/httpd/conf/httpd.conf 文件末尾加入即可.(不同方式安装的httpd可能主配置文件位置不同,请自行查找) 一.mod_deflate模块:文件压缩 官方文档: ...
- jQuery学习教程(1)
一.什么是jQuery JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safar ...
- Jquery 页面元素动态添加后绑定事件丢失方法,非 live
代码1: 以此方法绑定的input框事件,在通过add按钮后用jquery绑定的事件 alert就会丢失 <input type="button" value="A ...
- WCF、Web API、WCF REST、Web Service之区别
http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and-WCF-R ...