【BZOJ 2453】 维护队列
【题目链接】
https://www.lydsy.com/JudgeOnline/problem.php?id=2453
【算法】
带修改的莫队算法
当块的大小为N^(2/3)时,时间复杂度为 : O(n^(5/3))
但本题,当块的大小为sqrt(N)时,能够达到更优的复杂度
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10010
const int MAXC = 1e6 + ; int i,len,x,y,sum,l,r,n,now,qnum,m,cnt;
int a[MAXN],block[MAXN],s[MAXC],ans[MAXN];
char op[]; template <typename T> inline void read(T &x)
{
int f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
template <typename T> inline void write(T x)
{
if (x < )
{
putchar('-');
x = -x;
}
if (x > ) write(x/);
putchar(x%+'');
}
template <typename T> inline void writeln(T x)
{
write(x);
puts("");
}
struct info
{
int x,y,last;
} c[MAXN];
struct Query
{
int x,y,id,cur;
} q[MAXN]; inline bool cmp(Query a,Query b)
{
if (block[a.x] == block[b.x])
{
if (block[a.y] == block[b.y]) return a.cur < b.cur;
else return block[a.y] < block[b.y];
} else return block[a.x] < block[b.x];
}
inline void add(int x)
{
s[a[x]]++;
if (s[a[x]] == ) sum++;
}
inline void dec(int x)
{
s[a[x]]--;
if (s[a[x]] == ) sum--;
}
inline void worka(int now)
{
int x = c[now].x,y = c[now].y;
if (x >= l && x <= r) dec(x);
c[now].last = a[x];
a[x] = y;
if (x >= l && x <= r) add(x);
}
inline void workb(int now)
{
int x = c[now].x,y = c[now].y;
if (x >= l && x <= r) dec(x);
a[x] = c[now].last;
if (x >= l && x <= r) add(x);
} int main()
{ read(n); read(m);
len = sqrt(n);
for (i = ; i <= n; i++) block[i] = (i - ) / len + ;
for (i = ; i <= n; i++) read(a[i]);
for (i = ; i <= m; i++)
{
scanf("%s",&op);
read(x); read(y);
if (op[] == 'Q') q[++qnum] = (Query){x,y,qnum,cnt};
else c[++cnt] = (info){x,y,};
}
sort(q+,q+qnum+,cmp);
l = ; r = ; now = ; sum = ;
for (i = ; i <= qnum; i++)
{
for (; r < q[i].y; r++) add(r+);
for (; r > q[i].y; r--) dec(r);
for (; l < q[i].x; l++) dec(l);
for (; l > q[i].x; l--) add(l-);
for (now; now < q[i].cur; now++) worka(now+);
for (now; now > q[i].cur; now--) workb(now);
ans[q[i].id] = sum;
}
for (i = ; i <= qnum; i++) printf("%d\n",ans[i]); return ;
}
【BZOJ 2453】 维护队列的更多相关文章
- 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 ...
- BZOJ 2453 维护队列 | 分块
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2453 题解: 考虑维护每个位置的颜色上一次出现在哪里,计为pre[i],在询问l到r的时候, ...
- BZOJ.2453.维护队列([模板]带修改莫队)
题目链接 带修改莫队: 普通莫队的扩展,依旧从[l,r,t]怎么转移到[l+1,r,t],[l,r+1,t],[l,r,t+1]去考虑 对于当前所在的区间维护一个vis[l~r]=1,在修改值时根据是 ...
- 【BZOJ 2453|bzoj 2120】 2453: 维护队列 (分块+二分)
2453: 维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有 ...
- BZOJ 2120 数颜色&2453 维护队列 [带修改的莫队算法]【学习笔记】
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 3665 Solved: 1422[Submit][Status][Discuss] ...
- Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 2645 Solved: 1039[Submit][Status][Discuss] ...
- 【BZOJ】2453: 维护队列【BZOJ】2120: 数颜色 二分+分块(暴力能A)
先说正解:把所有相同的数相成一个链在每一个区间里的种数就是不同链的链头,那么记录每个数的上个相同数所在位置,那么只要找出l到r之间前驱值在l之前的数的个数就可以了 本人打的暴力,有一个小技巧,用cha ...
- [bzoj] 2453 维护数列 || 单点修改分块
原题 询问区间有种个颜色,单点修改某个位置. 修改次数<=1000 维护pre[i]为前一个与当前位置颜色一样的位置. 询问时以pre为关键字sort,lower_bound找pre<x的 ...
随机推荐
- Hadoop MapReduce编程 API入门系列之网页流量版本1(二十一)
不多说,直接上代码. 对流量原始日志进行流量统计,将不同省份的用户统计结果输出到不同文件. 代码 package zhouls.bigdata.myMapReduce.areapartition; i ...
- guice基本使用,guice整合guice-servlet,web scope注解(六)
guice servlet提供了几个比较有用的web scope,类似与传统servlet 的session,request这些提供的范围等. guice servlet 提供的web scope 如 ...
- 本地sql文件导入mysql数据库
mysql中配置my.ini interactive_timeout = 120 wait_timeout = 120 max_allowed_packet = 32M 导入sql运行命令 sourc ...
- listview 控件
private void Form1_Load(object sender, EventArgs e) { //设置该listview关联的imagelist listView1.LargeImage ...
- Splay树
class SplayNode { public: SplayNode *child[]; char value; int size; bool flip; SplayNode(), flip(fal ...
- 在webstrorm中配置好es6 babel【更新:在webstorm中配置.vue和.vue文件中支持es6】
第一步:全局安装babel-cli npm install -g babel-cli 第二步,新建一个空项目,在 WebStorm 中的当前项目中打开 Terminal,进入项目的根目录下, 安装 E ...
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍
http://www.cnblogs.com/wuhuacong/p/3344096.html 在前面介绍了一些关于最新基于MVC4+EasyUI的Web开发框架文章,虽然Web开发框架的相关技术文章 ...
- 应用二:Vue之ElementUI Form表单校验
(注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 表单校验是前端开发过程中最常用到的功能之一,根据个人的工作经验总结在此对表单校验功能的基 ...
- VMware VCSA 6.0安装过程 (转)
VMware VCSA 6.0安装过程(专版) 一.环境准备 VMware vCenter Server Appliance(VCSA)6.0的部署和之前的版本不同,在5.5及之前的版本可以通过 ...
- Ubuntu下安装Tensorflow
本文目录 引言 基于Anaconda的tensorflow安装 1 下载linux版本的Anaconda安装包 2 安装Anaconda 利用anaconda安装tensorflow 1 建立一个 c ...