【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的 ...
随机推荐
- JS 经验总结
1.IE中div的高度是content+padding+border之和,其它的是content的高度 2.一个标签里面只有一个属性,class='cls1 cls2' 3.同一页面不能出现相同的id ...
- Git Learning Part II - Working locally
file status life circle basic: modified: Examples: untracked: unmodified: modified: Git branching ...
- 修改织梦plus目录名
1.修改plus目录名 修改inlclude文件夹下common.inc.php 140行 //插件目录,这个目录是用于存放计数器.投票.评论等程序的必要动态程序 $cfg_plus_dir = $c ...
- 关于VS 2013连接Microsoft Access 2013的相关问题
① 下载安装Microsoft Access Database Engine 2010 Redistributable(28MB),共有32bit(下载)和64bit(下载)两个版本,具体要安 ...
- UWP App Services in Windows 10
1.AppServices in Universal Windows Platform(UWP) UWP 应用服务可以提供给另一个UWP应用.在Win10系统中,一个应用服务当作应用的一个方法和机制来 ...
- Segment公司--整合数据进行分析
YC毕业生Segment获得1500万美元A轮融资 现在收集数据是每一个公司的必修课了,而且是从各种不同 API 上收集数据,但是你还要把这些数据整合起来才能发挥作用,Segment就能帮你整合各个平 ...
- 6 Python+Selenium的元素定位方法(CSS)
[环境] python3.6+selenium3.0.2+Firefox50.0+win7 [定位方法] 1.方法:find_element_by_css_selector('xx') CSS的语法比 ...
- mvvm模式和mvc模式 概述总结对比
1.mvc模式简介: MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范.例如: angular ...
- UWP添加数字证书导出安装包本地安装
先生成一个简单的HelloWorld应用程序 <Page x:Class="HelloWorld.MainPage" xmlns="http://schemas.m ...
- HAOI2006 受欢迎的牛 缩点
不难分析出我们就是要求是否有唯一一个出度为0的强连通分量. Code: #include<cstdio> #include<stack> #include<algorit ...