【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 ...
随机推荐
- Xcode7网络问题
更新Xcode7以后运行模拟器,控制台打印:Application Transport Security has blocked a cleartext HTTP (http://) resource ...
- (转)操作型数据库的春天:MongoDB 1.5亿美元融资背后的故事
大部分融资都要耗时数月,但非关系式数据库MongoDB仅用3周时间就完成了1.5亿美元的融资.为什么这个进程会这么快,MongoDB CEO Max Schireson在接受采访时说,这是因为投资者看 ...
- const define 定义常量的区别
1.用const定义常量在编译的时候,提供了类型安全检查,而define 只是简单地进行字符串的替换 2.const定义的常量,会分配相应的内存空间.而define没有分配空间,只是在程序中与处理的时 ...
- C# 代理HTTP请求
目的: 应该有不少人需要去某些网站不停爬取数据,有时会使用HTTPRequest一直请求某个网站的某个网址.有的网站比如 QQ空间,赶集网(这是我测试的网站),不停刷新会提醒你的账号异常,可能会查封你 ...
- 关于RadAsm中GetEnvironmentStrings的BUG。
今天在asm中不通过msvcrt.inc调用c库. 所以.第一时间就在vc的lib中拷贝了libc.lib问价.加入工程后. 声明.调用如下: 然后.链接报错. libc.lib(crt0.obj) ...
- windows下tomcat切割日志按照日期输出
windows下tomcat默认不会把应用的日志信息输出在日志文件中的,只会在控制台打印. 解决方法: 1,下载工具cronolog-1.6.1-win32.zip,并解压. 2,把cronolog. ...
- C#使用反射工厂模式遇到System.TypeLoadException(类名错误导致)
项目中,在运行另一个反射类时出现问题,未能从程序集中加载类 class PopUpActionFactory { public static InterfacePopUpAction getActio ...
- 找回mysql数据库密码
前提条件:你需要有数据库服务器的权限 1:修改my.ini配置文件 Mysqld:其中的d代表什么? Deamon后台运行的服务程序,增加一行跳过权限验证 2:停止mysql服务运行 3:启动mysq ...
- 非常出色的一款WinForm窗体重绘GUI类库源码
基本控件的演示 ScrollBar滚动条 各种圆形进度条 ProgressBar进度条 Mdi演示,仿谷歌浏览器 多种皮肤可供选择 一套专业级别的GUI控件,目前包含了窗体.进度条.滚动条以及MDI多 ...
- window.onbeforeunload 如果取消, 那么javascript变量会保存
function confirmQuit1() { if (ischanged) return 'it is changed !! '; else return 'no change .. '; } ...