【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 ...
随机推荐
- iOS 9 之后更改状态栏字体颜色
设置statusBar的[前景部分] 简单来说,就是设置显示电池电量.时间.网络部分标示的颜色, 这里只能设置两种颜色: 默认的黑色(UIStatusBarStyleDefault) 白色(UISta ...
- C# 添加,修改,删除文件夹/文件集合
C#追加文件 StreamWriter sw = File.AppendText(Server.MapPath(".")+"\\myText.txt"); sw ...
- OpenGL7-2-快速绘制
代码下载 #include "CELLWinApp.hpp"#include <gl/GLU.h>#include <assert.h>#include & ...
- java内部类的定义原则
/*内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this2,外部类要访问内部类,必 ...
- 停车场管理软件附带源代码 J2EE服务端+android客户端
该源码是停车场管理软件附带源代码 J2EE服务端+android客户端,也是一套停车场管理车辆进出的管理软,喜欢的朋友可以看看吧. 应用的后台管理主要功能介绍:1 机构管理 ,机构有从属管理< ...
- SVN全量备份+增量备份脚本
一.全量备份 环境:一台主SVN,一台备SVN(主要提供备份功能),后续可通过钩子脚本进行实时备份,后续发给大家. 工作原理:通过svn的hotcopy命令过行热备份,并进行一系列的检查,备份后通过r ...
- Qt5中使用lambda表达式
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- 前端工程模块化——以一个php项目为例
实现一个页面功能总是需要 JavaScript.CSS 和 Template 三种语言相互组织,所以我们真正需要的是一种可以将 JavaScript.CSS 和 Template 同时都考虑进去的模块 ...
- PHP json_encode中日语问题
<?php header('Content-type:text/html;charset=utf-8'); $s = array('message'=>'4月以降.遺体の捜索活動が続けられ ...
- Spark Streaming揭秘 Day32 WAL框架及实现
Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...