【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的 ...
随机推荐
- Android GoogleMap 谷歌地图从零开始
说明 由于国内使用v2最新的谷歌地图有很多限制,所有如果要在真机上测试运行要做一些准备 准备1: vpn必不可少啦 推荐cloud vpn或者betternet都是不错的免费vpn 准备2: 由于最新 ...
- Vs2010无法打开文件“Kernel32.lib”、无法打开“libcpmt.lib”"msvcprt.lib"
1.对于无法打开"Kernel"问题,即使复制lib文件到目录,仍然会出现最后的错误; 原因:WindowsSdk 安装失败! 方法:重装 microsoft SDK6.0 ,再在 ...
- 杭电 2095 find your present (2)【位运算 异或】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2095 解题思路:因为只有我们要求的那个数出现的次数为奇数,所以可以用位运算来做,两次异或同一个数最后结 ...
- (转)Bootstrap 之 Metronic 模板的学习之路 - (6)自定义和扩展
https://segmentfault.com/a/1190000006815041 前面我们将 Metronic 的结构和源码大致浏览了一遍,Metronic 整个文件包有三百多兆,在实际项目中, ...
- 怎么用js或jq点击展开,出现隐藏的DIV,点击收起DIV又隐藏起来.
方法一:1 <script type="text/javascript"> $(function() { $("#toggle").click(fu ...
- 自动化构建之bower
官网地址:https://bower.io/ 网站由很多东西组成 - 框架,库,一个大型网站有很多人一块创建,那么因为版本或者其他的原因导致文件重复,或者不是最新的.例如:jq的版本不一样但是都是jq ...
- Linux date命令的用法(转)
1.命令:date 2.命令功能:date 可以用来显示或设定系统的日期与时间. 3.命令参数 -d<字符串>:显示字符串所指的日期与时间.字符串前后必须加上双引号: -s<字符串& ...
- JS中增加日期格式化原型函数之prototype
/** * javascript Date format(js日期格式化) * 对Date的扩展,将 Date 转化为指定格式的String 月(M).日(d).小时(h).分(m).秒(s).季度( ...
- CSS - Span 下的width设置不可用?
解决:Span 下的width设置不可用? 内联元素-span有根据内容自动伸缩的能力,当需要对其宽度设定时,出现无效的情况. Demo:http://jsfiddle.net/JSDavi/ad62 ...
- css3实现滚动手表
静态html: <!DOCTYPE html><html> <head> <meta charset="utf-8" /> < ...